快速排序算法
1、快速排序核心思想
挖坑 + 补坑 + 中轴数 + 左右指针(左右指针向中间移动将数组拆成左边和右边。左边的数都比中轴数小,右边的数都比中轴数大或相等)
2、快速排序思想步骤
a.挖取中轴数,一般都是数组左边或者右边第一个。
b.如果挖取左边第一个数为中轴数,则从右边开始比较大小将不符合数挖出填进左边的坑,此时右边有一个坑待用左边数填,左边数被挖出填到右边,
一直重复执行直到左右指针碰在一起将中轴数填进左右指针碰头的位置。第一趟快速排序完毕。
c.如果挖取右边第一个数为中轴数,则从左边开始比较大小将不符合数挖出填进右边的坑,此时左边有一个坑待用右边数填,右边数被挖出填到左边,
一直重复执行直到左右指针碰在一起将中轴数填进左右指针碰头的位置。第一趟快速排序完毕。
d.从那边开始移动指针?那要先看中轴数从那边取。选取的中轴数会被挖出形成空坑待填补
e.最核心思想:从一边挖了坑,从另外一边找数填坑。
3、快速排序例子说明快排思想
例子数组:[8,3,6,15,4,24,7,30]
l = left = 左指针
r = right = 右指针
a.中轴数:8。从左边将8挖出形成坑
[口,3,6,15,4,24,7,30]
b.从右边找出比8小的数填到左边的坑,此时找到r6=7挖出填入l0
[7,3,6,15,4,24,口,30]
c.从左边找出比8大的数填到右边的坑,此时找到l3=15挖出然后填入r6
[7,3,6,口,4,24,15,30]
d.从右边找出比8小的数填到左边的坑,此时找到r4=4,挖出然后填入l3
[7,3,6,4,口,24,15,30]
e.从左边找出比8大的数填到右边的坑,找着找着l4=r4,两指针碰在一起。将中轴数填入两指针碰在一起的位置。
[7,3,6,4,8,24,15,30]
f.此时左边都比8小,右边都比8大。第一趟快排完毕。生成两组数组,两组又一此方式排序
array1 = [7,3,6,4]
array2 = [24,15,30]
4、快速排序算法(下面快速排序算法写的有点难理解)
public static void main(String[] args) { //Scanner scan=new Scanner(System.in); int[] arr=new int[10]; for(int i=0;i<10;i++){ arr[i]= new Random().nextInt(100);//scan.nextInt(); } QuickSort(arr, 0, arr.length-1); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } public static void QuickSort(int[] arr,int low,int high){ int i,j,temp,t; if(low>high){ return; } i=low; j=high; //temp就是基准位 temp = arr[low]; while (i<j) { //先看右边,依次往左递减 while (temp<=arr[j]&&i<j) { //6<5 9 j--; } //再看左边,依次往右递增 while (temp>=arr[i]&&i<j) { //6>=7 i++; } //如果满足条件则交换 if (i<j) { t = arr[j]; arr[j] = arr[i]; arr[i] = t; } } //最后将基准为与i和j相等位置的数字交换 arr[low] = arr[i]; arr[i] = temp; //递归调用左半数组 QuickSort(arr, low, j-1); //递归调用右半数组 QuickSort(arr, j+1, high); }
1.1.快速排序算法代码解析:
- 两边同时扫描,符合条件指针向中间移动,left++,right--
- 当扫描不符合立即停下,当两边都扫描出不符合条件的位置时,交换两边位置的值。
- 直到两边指针碰在一起时整个数据扫描完,剩下处理两边指针相同位置的值
- 两边指针位置相同,两边扫描比较结束,但此时右边指针的值(i和j相等位置的值)有肯能会小于基准值,所以需要处理,要找左边的坑替换。由于左右指针的位置一样,表明左边是符合左边小于基准值。 所以最后只能用基准值的位置来交换了.
- 经过上面步骤整个数组分成两部分,通过j指针位置作为区分左右边,左边数组小于右边。通过上面步骤递归执行两边数组,直到完成
感谢您的阅读,您的支持是我写博客动力。