快速排序(Quicksort)是对冒泡排序的一种改进。
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
//快速排序算法
public class QuitSort {
public static void main(String[] srgs){
int arr[] = {12,2,16,30,28,10,16,20,6,18};
show(arr);
quit_sort(arr, 0, arr.length - 1);
show(arr);
}
//输出数组
private static void show(int[] arr){
int len = arr.length;
int i;
for(i = 0; i < len - 1; i++){
System.out.print(arr[i] + " ");
}
System.out.println(arr[len - 1]);
}
//排序算法
private static void quit_sort(int[] arr, int begin, int end){
int pivot = arr[begin]; //选取的参考对象
int low = begin; //起始指针
int height = end; //末尾指针
boolean direction = true; //比较方向的位置
if(height - low <= 1){
return; //不用排序
}
L1: while(low < height){
if(direction){ //从右到左
for(int i = height; i > low; i--){
if(arr[i] < pivot){
arr[low++] = arr[i];
height = i;
direction = !direction;
continue L1;
}
}
height = low;
}else{ //从左到右
for(int i = low; i < height; i++){
if(arr[i] > pivot){
arr[height--] = arr[i];
low = i;
direction = !direction;
continue L1;
}
}
low = height;
}
}
arr[low] = pivot; //最后将比较对象赋值
quit_sort(arr, begin, low - 1); //左半部分排序
quit_sort(arr, low + 1, end); //有半部分排序
}
}
使用while循环的举例
public static void quit_sort(int a[], int low, int high)
{
if(low >= high)
{
return;
}
int first = low;
int last = high;
int key = a[first];/*用字表的第一个记录作为枢轴*/
while(first < last)
{
//找右半部分小于key的值
while(first < last && a[last] >= key)
{
--last;
}
a[first] = a[last];/*将比第一个小的移到低端*/
//找左半部分大于key的值
while(first < last && a[first] <= key)
{
++first;
}
a[last] = a[first]; /*将比第一个大的移到高端*/
}
/*将枢轴存到起始位置【因为key的值是起始元素】
否则,起始位置数据会丢失
注 起始位置不是数组的第一个元素,是while循环后的位置
*/
a[first] = key;
quit_sort(a, low, first-1);
quit_sort(a, first+1, high);
}
平均复杂度是:nlog(n)
最坏的情况是: n^2
最好的情况是: nlog(n)