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语句来达到目的,但是在网上看到的博客大家都是使用循环,如果有知道的朋友欢迎给我解答