快速排序时交换排序的一种,交换排序还有冒泡排序。快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。此时解决方案可以随机打乱序列的顺序。
快速排序不是一种稳定的排序,在于high指针在往左移动的过程中与中枢元素交换的时候会改变相对顺序。
如:49 29 38 49 20 97 76
思路:
1)选择一个基准元素,通常选择第一个元素或者最后一个元素,
2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。
3)此时基准元素在其排好序后的正确位置
4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。
一次分治partition示例(找到第一个元素的实际位置):
然后贴上java实现的代码,是基于严教材中的思路实现的:
public class quickSort {
public static void quick_sort(int[] array,int low,int high){
if(low < high){
int pivotpos = partition(array, low, high);
quick_sort(array, low, pivotpos-1);
quick_sort(array, pivotpos+1, high);
}
}
public static int partition(int[] array,int low,int high){
int pivot = array[low]; // 将枢纽值设为第一个元素
while (low<high){
while (low<high && array[high]>=pivot){high--;}
array[low] = array[high];
while (low<high && array[low]<=pivot){low++;}
array[high] = array[low];
}
array[low] = pivot; // 找到枢纽值所在的位置
return low;
}
public static void main(String[] args) {
int[] arr = {7,3,1,2,5,4};
quick_sort(arr,0,arr.length-1);
for(int i:arr){
System.out.println(i);
}
}
}
代码中数组为形参且没返回 但是其值确改变的原因是:Java方法基本数据类型是传值,对象类型传引用。这里传进来的数组是这个数组的引用,而在方法内部改变了对象的内容,所以实参的值也改变了。
(详见:http://blog.csdn.net/wanliguodu/article/details/55653876)