快速排序时对冒泡排序的一种改进。
实现思想:通过一趟排序将待排序记录(数组)分割成独立的两部分,其中一部分的元素均比另一部分的元素要小,则可以对这两部分记录继续进行排序,从而达到整个序列有序。实现的本质是对递归的应用。
步骤一:找一个枢轴。最好的情况是找一个能够使两侧子数组的数目相等的元素。
步骤二:扫描数组,并将元素分配到两个子数组中。
//quicksort(Object[] array)
// 选择数轴tmp
// 将元素进行两侧划分成子数组suba1和suba2
// 对子数组在进行快速排序
public classquicksort {
public static void main(String[] args){
int[] a ={8,5,4,7,6,1,6,3,8,12,10};
if(a.length <= 0){
return;
}
System.out.println("排序之前:\n"+Arrays.toString(a));
quicksort(a,0, a.length-1);
System.out.println("排序之后:\n"+Arrays.toString(a));
}
public static int getMiddle(int[] array, int low, int high){
int tmp = array[low];//数组的第一个作为数轴
while(low < high){
//右侧元素大于数轴,high下标减1;否则(比数轴小)将其放在元素左侧
while(low < high&& array[high] >= tmp){
high--;
}
array[low]= array[high];//比数轴小的记录移动到左侧
//左侧元素小于数轴,low下标加1;否则(比数轴大)将其放在元素右侧
while( low < high&& array[low] <=tmp){
low++;
}
array[high]= array[low];//比数轴大的元素放在右侧
}
array[low]= tmp;//数轴记录到最后
return low;//返回数轴的位置
}
public static void quicksort(int[] list, int low, int high){
if(low < high){
int middle = getMiddle(list,low, high);//将list数组一分为二
quicksort(list,low, middle-1);
quicksort(list,middle+1, high);
}
}
}
快速排序的平均时间复杂度是O(nlogn),但具体情况还要取决于选取枢轴对子数组的划分情况。