排序算法
快速排序
指针顺序问题
由于一般选择左侧作为基准数,故一般右侧指针先动;(无论排递增还是排递减)
原因
如果基准数侧先动:
对侧第一个数字若需要置换,则会将基准数赋值给其,置换后对侧第一个数字直接消失。(基准数换到了对侧,而对侧数没有被存储)
如果对侧先动:
对侧第一个数字若需要置换,基准数位置将保存对侧第一个数字,基准数本身将保存在临时变量中;没有问题~
package com.zoya.springboot.test;
public class QuickSort {
public static void main(String[] args) {
int[] arr=new int[]{7,8,2,1,9,3,4};
quicksort(arr,0,arr.length-1);
}
static void quicksort(int[] arr,int begin,int end){
if(begin<end) {
int base = arr[begin];
System.out.println("===【new round】sort "+begin+" ~ "+end+". base="+base+"===");
printArrIndex(arr,begin,end,0);
int i=begin;
int j=end;
while (i < j)
{
while (i < j && arr[j] >= base){
j--;
// printArrIndex(arr,i,j,0);
}
arr[i] = arr[j];
// printArrIndex(arr,i,j,1);
while (i < j && arr[i] < base){
i++;
// printArrIndex(arr,i,j,0);
}
arr[j] = arr[i];
// printArrIndex(arr,i,j,1);
}
arr[j] = base;
// printArrIndex(arr,i,j,2);
quicksort(arr, begin, i - 1);
quicksort(arr, i + 1, end);
}
}
static void printArr(int[] arr,int exchanged){
int k=0;
while(k<arr.length)
System.out.print(arr[k++]+"\t");
if(exchanged==1)
System.out.print("[exchanged]");
if (exchanged==2)
System.out.print("[base index exchanged]");
System.out.println();
}
static void printArrIndex(int[] arr,int begin,int end,int exchanged){
printArr(arr,exchanged);
for(int q=0;q<end;q++){
if(q==begin)System.out.print("l\t");
else System.out.print(" \t");}
System.out.print("r\t");
System.out.println();
}
}
===【new round】sort 0 ~ 6. base=7
7 8 2 1 9 3 4
l r
4 8 2 1 9 3 4 [exchanged]
l r
4 8 2 1 9 3 4
l r
4 8 2 1 9 3 8 [exchanged]
l r
4 8 2 1 9 3 8
l r
4 3 2 1 9 3 8 [exchanged]
l r
4 3 2 1 9 3 8
l r
4 3 2 1 9 3 8
l r
4 3 2 1 9 3 8
l r
4 3 2 1 9 9 8 [exchanged]
l r
4 3 2 1 9 9 8
r
4 3 2 1 9 9 8 [exchanged]
r
4 3 2 1 9 9 8 [exchanged]
r
4 3 2 1 7 9 8 [base index exchanged]
r
===【new round】sort 0 ~ 3. base=4
4 3 2 1 7 9 8
l r
1 3 2 1 7 9 8 [exchanged]
l r
1 3 2 1 7 9 8
l r
1 3 2 1 7 9 8
l r
1 3 2 1 7 9 8
r
1 3 2 1 7 9 8 [exchanged]
r
1 3 2 4 7 9 8 [base index exchanged]
r
===【new round】sort 0 ~ 2. base=1
1 3 2 4 7 9 8
l r
1 3 2 4 7 9 8
l r
1 3 2 4 7 9 8
r
1 3 2 4 7 9 8 [exchanged]
r
1 3 2 4 7 9 8 [exchanged]
r
1 3 2 4 7 9 8 [base index exchanged]
r
===【new round】sort 1 ~ 2. base=3
1 3 2 4 7 9 8
l r
1 2 2 4 7 9 8 [exchanged]
l r
1 2 2 4 7 9 8
r
1 2 2 4 7 9 8 [exchanged]
r
1 2 3 4 7 9 8 [base exchange index]
r
===【new round】sort 5 ~ 6. base=9
1 2 3 4 7 9 8
l r
1 2 3 4 7 8 8 [exchanged]
l r
1 2 3 4 7 8 8
r
1 2 3 4 7 8 8 [exchanged]
r
1 2 3 4 7 8 9 [base index exchanged]
r