本帖最后由 fantacyleo 于 2014-7-6 19:07 编辑
这段快排代码思路不是很清晰。我觉得比较好理解的快排思路是这样的:
在待排序数组中选一个数作为key,一般选数组首元素。然后通过交换,让数组变成这样:key元素左边的元素都小于key,key元素右边的元素都大于等于key。接下来对key左右的两个子数组分别排序就可以了。图示如下:
实现代码:
- void quickSort(int[] arr, int start, int end) {
- if(start >= end)
- return;
- int key = arr[start];
- int i = start, j = end;
- while(true) {
- // 从尾部开始找到一个小于key的元素
- while(i < j && arr[j] >= key)
- j--;
- // 从头部开始找到一个大于或等于key的元素
- while(i < j && arr[++i] < key)
- ;
- // 交换这两个数
- swap(arr, i, j);
- // i,j相遇,查找结束
- if(i == j)
- break;
- }
- // key左边的元素都小于key,key右边的元素都大于或等于key
- swap(arr, start, j);
- // 排序key左右两个子数组
- quickSort(arr, start, j - 1);
- quickSort(arr, j + 1, end);
- }
复制代码 |