快速排序
快速排序是冒泡排序的升级,它们都是交换排序类。
快速排序(Quick Sort)基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可对这两部分记录继续进行排序,以达到整个序列有序的目的。
简单举例:
一个自然数列:7、31、11、7、4,自然排序(由小到大)
设:key=关键字值,界限left=在left之前都不大于key,界限right=在right之后都不小于key,条件left<right;描述:位置->值
步骤:
第一步:缩短界限right界限,right值与key交换
第二步:缩短界限left界限,left值与key交换
第三步:若left<right执行第一步
第一趟比较:
1)key=7,left=1,right=5;缩短界限right界限得right=5,交换5->4与1->7得4、31、11、7、7
2)left=2,right=3;缩短界限left界限得left=2,交换2->31与5->7得4、7、11、7、31
3)left=2,right=5;left<right执行第一步,right=2
4)left=right=2第一趟结束
后续:以第一趟left,right位置拆分左右两部分,采用第一趟相同的策略分别比较;
代码实现:
1 import java.util.Arrays; 2 3 public class Sort { 4 /** 5 * 快速排序 6 * 7 * @param arr 8 */ 9 private static void quickSort(int[] arr, int left, int right) { 10 int pivot; 11 if (left < right) { 12 pivot = partition(arr, left, right); 13 quickSort(arr, left, pivot); 14 quickSort(arr, pivot + 1, right); 15 } 16 } 17 18 private static int partition(int[] arr, int left, int right) { 19 int key = arr[left]; 20 while (left < right) { 21 //缩短right,使right值小于key 22 while (left < right && arr[right] >= key) { 23 right--; 24 } 25 //使left=right值 26 if (left < right) { 27 arr[left] = arr[right]; 28 } 29 //缩短left,使left值大于key 30 while (left < right && arr[left] <= key) { 31 left++; 32 } 33 //使right=left值 34 if (left < right) { 35 arr[right] = arr[left]; 36 } 37 arr[left] = key;//设置key 38 } 39 return left; 40 } 41 42 public static void main(String[] args) { 43 int arr[] = {1, 331, 2, 5, 6, 12, 312, 13, 1, 33, 123, 7, 12, 17, 444, 11, 3, 14, 1, 33, 1, 2}; 44 int qrr[] = Arrays.copyOf(arr, arr.length); 45 int jrr[] = Arrays.copyOf(arr, arr.length); 46 quickSort(qrr, 0, arr.length - 1); 47 System.out.println("quickSort:" + Arrays.toString(qrr)); 48 Arrays.sort(jrr);//api 排序 49 System.out.println("api排序 :" + Arrays.toString(jrr)); 50 } 51 }

浙公网安备 33010602011771号