快速排序主题思想:
分区法+挖坑填数法。
1、先从数列中取出一个数作为枢纽关键字,一般用第一个元素
2、分区过程,将比这个枢纽关键字大的数全放在它的右边,把小于或者等于的数全放在它左边
3、再对左右分区进行第二步的操作,也就是递归。知道各个区间只有一个数为止
时间复杂度:
快速排序不断的进行递归,将比枢纽关键字小的放在左边,否则放在右边,平均情况下需要递归log2N次,在最坏情况下,即数组已经有序或大致有序的情况下,每次划分只能减少一个元素,需要递归n次,所以快速排序时间复杂度下界为O(nlogn),最坏情况为O(n^2)。在实际应用中,快速排序的平均时间复杂度为O(nlogn)。
public class Qsort {
public int partition (int a[],int low,int high)
{
int key=a[low];
//int i=low;
//int j=high;
if(low<high)
{
while (low<high)
{
while (low<high&&a[high]>=key)//从右边循环直到找到比关键字小的项才退出
{
high--;
}
if (low<high) //将比关键字小的值赋值到左边
{
a[low]=a[high];
low++;
}
while (low<high&&a[low]<=key) //从左边循环直到找到比关键词大的项才退出
{
low++;
}
if (low<high) //将比关键字大的值赋到右边
{
a[high]=a[low];
high--;
}
}
a[low]=key;
}
return low;
}
public void lsort(int a[],int low, int high)
{
if (low<high)
{
int i=partition(a,low,high);
lsort(a,low,i-1);
lsort(a,i+1,high);
}
}
public static void main(String[] args)
{ Qsort qs =new Qsort();
int a[]={49,38,65,97,76,13,27,30};
qs.lsort(a,0,a.length-1);
for (int i:a)
System.out.println(i);
}
}