什么是排序算法
首先,我们要知道排序是什么呢?
排序是计算机内经常用到的一种操作,所谓排序,就是一串数据根据其中的某种特性或某种特点,逐渐增加或逐渐递减的排列起来的一种操作。
那么算法又是什么呢?为什么要用算法来排序?
算法是描述解决问题的方法(解决特定问题的步骤描述),在计算机中表现为指令的有序序列,为了解决某个问题,就需要指令表示成一定的操作序列,而每一个操作也都代表着特定的功能,这就是算法了。
而排序算法就是在计算机中将数据按照要求排列的一种方法,尤其是在处理大量数据的时候,一个好的算法可以节省大量的资源,但是要想得到一个符合要求的优秀的算法,也必须经过大量的推算和分析。
快速排序
快速排序其实是对冒泡排序的一种改进,将数据进行不断的移动和比较来实现排序。
而快速排序算法,之所以说它快速的原因,并不是因为它比其他的排序算法都要快,而是从实践中证明了快速排序在平均性能上的确是比其他算法要快一些。
具体算法
/**
* 快速排序
* @author huazhou
*
*/
public class Quick extends Model{
public void sort(Comparable[] a){
StdRandom.shuffle(a); //消除对输入的依赖
sort(a, 0, a.length - 1);
}
private void sort(Comparable[] a, int lo, int hi){
if(hi <= lo){
return ;
}
int j = partition(a, lo, hi); //切分
sort(a, lo, j-1); //将左半部分a[lo..j-1]排序
sort(a, j+1, hi); //将右半部分a[j+1..hi]排序
}
/**
* 快速排序的切分
* 将数组切分为a[lo..i-1],a[i],a[i+1..hi]
*/
private int partition(Comparable[] a, int lo, int hi){
int i = lo, j = hi+1; //左右扫描指针
Comparable v = a[lo]; //切分元素
//扫描左右,检查扫描是否结束并交换元素
while(true){
while(less(a[++i], v)){
if(i == hi){
break;
}
}
while(less(v, a[--j])){
if(j == lo){
break;
}
}
if(i >= j){
break;
}
exch(a, i, j);
}
exch(a, lo, j); //将v=a[j]放入正确的位置
return j; //a[lo..j-1]<=a[j]<=a[j+1..hi]达成
}
}
总结
尽管快速排序有很多优点,它的基本实现仍有一个潜在的缺点:在切分不平衡时这个程序可能会极为低效。例如,如果第一次从最小的元素切分,第二次从第二小的元素切分,如此这般,每次调用只会移除一个元素。这会导致一个大子数组需要切分很多次。我们要在快速排序前将数组随机排序的主要原因就是要避免这种情况。它能够使产生糟糕的切分的可能性降到极低,我们就无需为此担心了。
总的来说,可以肯定的是对于大小为N的数组,快速排序算法的运行时间在1.39NlgN的某个常数因子的范围之内。归并排序也能做到这一点,但是快速排序一般会更快(尽管它的比较次数多39%),因为它移动数据的次数更少。这些保证都来自于数学概率,你完全可以相信它。