快速排序算法
快速排序算法是一种较为高效的排序算法,采用了“挖坑填数+分而治之”的思想。该算法的时间复杂度最好时为O(nlogn),最差时为O(n^2),空间复杂度为O(logn),也是不稳定的,适合n值较大的排序任务。
该算法的基本思想是:每次排序都找一个基准位,使得基准位前端的部分每个数都小于该基准位上的数,基准位后端的部分每个数都大于该基准位上的数,然后递归该过程,知道待排序序列中的所有元素都有序为止。
快速排序算法的一种实现如下(Java版):
1 /** 2 * 快速排序(挖坑填数+分治法) 3 * @author JiaJoa 4 * 通过查找一个待排序的序列中的一个基准位置(一般以第一个数为基准), 5 * 使得基准左边的都小于这个基准,基准右边的都大于这个基, 6 * 然后使用递归等方法对左右两边执行同样的快速排序 7 * 8 */ 9 public class Algorithm_QuickSort { 10 public static void main(String[] args){ 11 int[] data = new int[]{7,1,6,4,3,2,1,23}; 12 13 Algorithm_QuickSort.quickSort(data); 14 } 15 16 //第一步,查找一个基准位 17 public static int getPart(int low,int high,int[] data){ 18 19 int comData = data[low]; //设定一个初始基准 20 while(low<high){ 21 while(low<high&&data[high]>=comData){//从右向左查找 22 high--; 23 } 24 if(low<high){ 25 data[low] = data[high]; //小于基准的移到低端 26 } 27 28 while(low<high&&data[low]<=comData){ //从左向右查找 29 low++; 30 } 31 if(low<high){ 32 data[high]=data[low]; //大于基准的移到高端 33 } 34 } 35 data[low] = comData; //基准位置不再变化时 36 return low; 37 } 38 39 //第二步,采用递归的方式处理基准左右两堆 40 public static void quick_Recursion(int low,int high,int[]data){ 41 42 int base; 43 if(low<high){ 44 base = getPart(low,high,data);//获取基准 45 quick_Recursion(low,base-1,data);//对低基准位段进行递归排序 46 quick_Recursion(base+1,high,data);//对高基准位段进行递归排序 47 } 48 } 49 50 //第三步,打印排序的序列 51 public static void quickSort(int[] data){ 52 quick_Recursion(0,data.length-1,data); 53 54 StringBuilder playnum = new StringBuilder(); 55 for(int i : data){ 56 playnum.append(i+","); 57 } 58 System.out.println(playnum.toString()); 59 } 60 }