快速排序的Java和python实现,亲测实际可用

1.基本思想

  快速排序每趟排序确定一个元素x的位置,使用的方式是 将大于元素x的值放大x的右边,小于元素x的值放大x的左边。当确定x的位置之后,再分别对x左边的数组和右边的数组进行快速排序即可。

2.算法实现

  这里我使用的是递归的方法。

  假设先取数组第一个元素为x,同时设i,j分别指向数组头部和数组尾部,即i=0,j=length(arr)-1;因为x取得第一个元素,所以最开始i所指向的位置即x的位置。

  先从尾部j指向的元素开始比较,只要j指向的元素大于x,j便向前移一位;一旦j指向的元素小于x,就将j指向的元素放在当前x所在的位置(即当前i指向的位置),此时可以当做x目前处于j所指向的位置。然后将x与i所指向的元素进行比较,只要i指向的元素小于x,i便向后移动一位;一旦i指向的元素大于x,就将i指向的元素放在当前x所在的位置(即当前j所指向的位置),此时可以将x的位置认为是i指向的位置。不断循环,直到  i>=j。此时便找到了x最终的位置,即此时i,j所共同指向的位置。再将x的值填到这个位置当中,便完成了一趟快速排序。

java的代码实现如下:因为初学java,这里使用方法的时候踩了几个坑,发现静态方法中不能调用非静态成员,后来把sort改为非静态方法

 1 public class QuickSort {
 2     public static void main(String args[]) {
 3         int arr[] = {6,2,10,3,8,9};
 4         QuickSort sorter = new QuickSort();
 5         int m = 0, n = arr.length - 1;
 6         sorter.sort(arr, m, n);
 7     }
 8     
 9     
10     public void sort(int arr[], int m, int n) {
11         if(m < n) {
12             int x = arr[m];//每次确定位置的数组元素
13             int i = m, j = n;
14             while(i < j) {//快速排序的核心,将大于x的值全放大x的右边,小于的全放在左边
15                 while(i < j && x < arr[j]) {
16                     j--;
17                 }
18                 if(x > arr[j]) {//如果j指向的数小于x,则放到x左边;if条件以防止循环因i>=j终止
19                     arr[i] = arr[j];
20                 }
21                 while(i < j && x > arr[i]) {
22                     i++;
23                 }
24                 if(x < arr[i]) {//如果i指向的数大于x,则放大x右边
25                     arr[j] = arr[i];
26                 }
27             }
28             arr[i] = x;
29             showArray(arr);
30             sort(arr, m, i-1);//对左边的部分进行快速排序
31             sort(arr, i+1, n);//对右边的部分进行快速排序
32         }
33     }
34     
35     public void showArray(int arr[]) {
36         for(int x:arr){
37             System.out.print(x+"、");
38         }
39         System.out.println("");
40     }
41 }

python 的代码实现如下

 1 # -*- coding: utf-8 -*-
 2 
 3 def QuickSort(lista, m, n):
 4     if m < n:
 5         i = m
 6         j = n
 7         x = lista[i]
 8         while i < j:#第一趟排序
 9             while i < j and x < lista[j]:
10                 j = j - 1
11             if x > lista[j]:
12                 lista[i] = lista[j]
13             while i < j and x > lista[i]:
14                 i = i + 1
15             if  x < lista[i]:
16                 lista[j] = lista[i]
17         lista[i] = x#确定x位置后,将x放入该位置
18         print(lista)
19         QuickSort(lista, m, i - 1)#递归处理左边部分
20         QuickSort(lista, i + 1, n)#递归处理右边部分
21         return lista
22 
23 
24 if __name__ == '__main__':
25     listx = [6,2,10,3,8,9]
26     a = 0
27     b = len(listx) - 1
28     listb = QuickSort(listx, a, b)
29     print(listb)

最后其实发现,每趟排序中的j--,i++部分的循环体均可以使用if语句来达到目的,但是在网上看到的博客大家都是使用循环,如果有知道的朋友欢迎给我解答

猜你喜欢

转载自www.cnblogs.com/xiang9286/p/9650083.html
今日推荐