快速排序
本质来说,快速排序的过程就是不断地将无序元素集递归分割,一直到所有的分区只包含一个元素为止。
由于快速排序是一种分治算法,我们可以用分治思想将快排分为三个步骤:
1.分:设定一个分割值,并根据它将数据分为两部分
2.治:分别在两部分用递归的方式,继续使用快速排序法
3.合:对分割的部分排序直到完成
1 public int dividerAndChange(int[] args, int start, int end) 2 { 3 //标准值 4 int pivot = args[start]; 5 while (start < end) { 6 // 从右向左寻找,一直找到比参照值还小的数值,进行替换 7 // 这里要注意,循环条件必须是 当后面的数 小于 参照值的时候 8 // 我们才跳出这一层循环 9 while (start < end && args[end] >= pivot) 10 end--; 11 12 if (start < end) { 13 swap(args, start, end); 14 start++; 15 } 16 17 // 从左向右寻找,一直找到比参照值还大的数组,进行替换 18 while (start < end && args[start] < pivot) 19 start++; 20 21 if (start < end) { 22 swap(args, end, start); 23 end--; 24 } 25 } 26 27 args[start] = pivot; 28 return start; 29 } 30 31 public void sort(int[] args, int start, int end) 32 { 33 //当分治的元素大于1个的时候,才有意义 34 if ( end - start > 1) { 35 int mid = 0; 36 mid = dividerAndChange(args, start, end); 37 // 对左部分排序 38 sort(args, start, mid); 39 // 对右部分排序 40 sort(args, mid + 1, end); 41 } 42 } 43 44 private void swap(int[] args, int fromIndex, int toIndex) 45 { 46 args[fromIndex] = args[toIndex]; 47 }