目录
一、基本思想
快速排序(Quicksort)是对冒泡排序的一种改进。也是交换排序。
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都 要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
二、过程示意图
假设有如下无序序列arr[]:
61 I | 33 | 48 | 82 | 72 | 11 | 25 | 48 J |
先将第一个拿出来,即设 arr[i] = 61,
第1趟排序:
第1次交换: arr[i]和最后一个 arr[J](48)比较,按照基本思想,48应该在 arr[i]左边,但是事实上在右边,所以交换俩者,
然后i++;
结果如下:
48 | 33 I | 48 | 82 | 72 | 11 | 25 | 61 J |
第2次交换: arr[i]和最后一个 arr[J](61)比较,按照基本思想, arr[i]应该在左边,符合事实,则
i++;
第3次也是,符合事实,i++;
结果如下:
48 | 33 | 48 | 82 I | 72 | 11 | 25 | 61 J |
第4次交换:arr[i]和最后一个 arr[J](61)比较,按照基本思想,61应该在 arr[i]左边,但是事实上在右边,所以交换俩者,
然后i++;
结果如下:
48 | 33 | 48 | 61 i | 72 | 11 | 25 J | 82 |
......
48 | 33 | 48 | 25 | 72 i | 11 | 61 J | 82 |
48 | 33 | 48 | 25 | 61 i | 11 | 72 J | 82 |
48 | 33 | 48 | 25 | 11 | 61 i J | 72 | 82 |
以此类推,符合事实不交换,i++或者J--,直到 i == J 结束第一趟。
排完第一趟后,找出来了arr[0]即61的位置,再把61左右俩边的序列分别进行上述排序,直到序列被分为大小为1,找到所有记录的位置,这样就排好序了。
三、代码实现过程
/**
* 快速排序
*/
void quickSort( int arr[], int low, int high ){
int flag;
if(low<high){
flag=partition(arr,low,high);
quickSort(arr,low,flag-1);
quickSort(arr,flag+1,high);
}
}
//把arr[low]放在最终位置,即将比arr[low]小的划分到左边,大的划分到右边
int partition(int[] arr, int low, int high) {
int flag;
flag=arr[low];
while(low < high){//当low=hign时结束循环
while (low < high && arr[high] >= flag){
high--;
}
swap(arr,low,high);
while (low < high && arr[low] <= flag){
low++;
}
swap(arr,low,high);
}
return low;
}
//交换
void swap(int[] arr, int i, int j) {
int t;
t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
四、复杂度