Java/C++实现快速排序
2017-08-22 20:48
260 查看
原文:http://www.algolist.net/Algorithms/Sorting/Quicksort
1. 选择校对值(pivot)。可以随便选择一个数作为校对值,这个数可以是任意一个数组里的值,甚至可以不是数组里的。
2. 划分(Partition)。重新排列数组,比校对值小的放左边,比校对值大的放右边。相等的可以放在任意一边。注意:这个数组可能会被分为长度不等的新数组。
3. 排列各个分数组。使用递归排列左右两边的数组。
当一次partition操作结束时,所有 i 左边的值都比 pivot 值小(或相等),右边的值都比 pivot 大(或相等)。
举例: {1, 12, 5, 26, 7, 14, 3, 7, 2}
![](https://img-blog.csdn.net/20170822203320269?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlfeV93/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
注意:上面图示只展示了第一次排列,而后对于数组{1, 2, 5, 7, 3} 和 {14, 7, 26, 12}再次执行递归操作即可完成排序。
C++
快速排序
快速排序是一种很常见的排序算法(面试题),不仅是为了教学目的,即便在实际工作中也会用到很多。时间复杂度为 O(n logn)。算法
使用了分治策略,步骤如下:1. 选择校对值(pivot)。可以随便选择一个数作为校对值,这个数可以是任意一个数组里的值,甚至可以不是数组里的。
2. 划分(Partition)。重新排列数组,比校对值小的放左边,比校对值大的放右边。相等的可以放在任意一边。注意:这个数组可能会被分为长度不等的新数组。
3. 排列各个分数组。使用递归排列左右两边的数组。
算法详解
定义两个变量 i、j,最初时让 i 指向数组的第一个元素的索引,j 指向最后一个。接下来对 i 递增操作直到元素的值>=校对值(pivot),然后对 j 递减操作直到元素的值 <= 校对值。如果 i <= j,就交换这两个值,并且i++,j--。当 i>j 时,停止。
当一次partition操作结束时,所有 i 左边的值都比 pivot 值小(或相等),右边的值都比 pivot 大(或相等)。
举例: {1, 12, 5, 26, 7, 14, 3, 7, 2}
注意:上面图示只展示了第一次排列,而后对于数组{1, 2, 5, 7, 3} 和 {14, 7, 26, 12}再次执行递归操作即可完成排序。
复杂度分析
一般情况下,复杂度是O(n logn),但是在极端情况下,可能会执行O(n2)次。代码实现
Javaint partition(int arr[], int left, int right){ int i = left, j = right; int tmp; int pivot = arr[(left + right) / 2]; while (i <= j) { while (arr[i] < pivot) i++; while (arr[j] > pivot) j--; if (i <= j) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i++; j--; } }; return i; } void quickSort(int arr[], int left, int right) { int index = partition(arr, left, right); if (left < index - 1) quickSort(arr, left, index - 1); if (index < right) quickSort(arr, index, right); }
C++
void quickSort(int arr[], int left, int right) { int i = left, j = right; int tmp; int pivot = arr[(left + right) / 2]; /* partition */ while (i <= j) { while (arr[i] < pivot) i++; while (arr[j] > pivot) j--; if (i <= j) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i++; j--; } }; /* recursion */ if (left < j) quickSort(arr, left, j); if (i < right) quickSort(arr, i, right); }
相关文章推荐
- 快速排序详解及JAVA/C++实现
- 用Java、C++、python实现快速排序
- I/O流的设计(Java的InputStream/OuputStream和Reader/Writer的C++实现)
- java调用C++实现口令屏蔽
- 通过JNI实现Java和C++的相互调用
- Java中实现C++中的enum
- 在JAVA中实现C++代码的复用
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 这个用C++实现的效果可以用C#或JAVA实现吗
- 快速排序实现(JAVA)
- 排序算法复习(Java实现): 插入,冒泡,选择,Shell,快速排序
- java中用句柄与封装基础类的方法实现C++中指针的部分效果
- 一种实现 Java调用C++的DLL的方法
- 数据结构——快速排序原理及算法Java实现
- Ajax - JavaScript之实现私有属性、像C++和Java一样支持基于类的继承方法之例子
- 一个Java Enum的C++实现
- Delphi中实现C++/Java类似静态变量的功能
- 时间和日历类的设计(Java的Date和Calendar的C++实现)
- java实现快速排序
- I/O流的设计(Java的InputStream/OuputStream和Reader/Writer的C++实现)