1:基本思想:
快速排序是属于交换类排序,采用不断的比较和移动来实现排序。快速排序是一种非常高效的排序算法,它的实现,增大了记录和比较和移动的距离,从而减少总的比较此时和移动次数。采用分而治之的思想,将一个大的问题拆成一个小的问题,小的问题拆成更小的问题。
快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
步骤为:
- 从数列中挑出一个元素,称为"基准"(pivot),
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
快速排序的分析
实现代码:
public class Quick { public static void main(String[] args) { int[] ins = {2,3,5,1,23,6,78,34}; int[] ins2 = sort(ins,0,ins.length-1); for(int in: ins2){ System.out.println(in); } } public static int[] sort(int[] ins ,int start,int end){ if(start>=end){ return ins;//这个返回值并没有影响,因为这个返回值没有使用到。 } int mid = ins[start]; int low = start; int hight = end; while(low < hight){ while(low < hight && ins[hight]>=mid){// hight -=1; } ins[low] = ins[hight]; while(low < hight && ins[low] < mid){ low +=1; } ins[hight] = ins[low]; } ins[low] = mid; sort(ins, start, low-1); sort(ins, low+1, end); return ins; } }