参考自《算法设计与分析基础第3版》p136。中轴元素选最左边的那个,i和j分别从左边和右边向中间扫描。
package cn.edu.nju.zyf.quicksort;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {4,65,1,78,65,29,3,9,41,5,7,16,2,3,798,45,0,6,9,45,12,54};
quickSort(arr,0,arr.length-1);
for(int i = 0;i<arr.length;i++) {
System.out.print(arr[i]+" ");
}
}
public static void quickSort(int arr[], int begin, int end) {
if(begin<0) return;
if(end < 0) return;
if(begin>=end) return;
int i = begin;
int j = end+1;
int p = begin;
while(i<j) {
i++;
j--;
while( arr[i]<=arr[p] && i<end) {
i++;
}
while( arr[j]>arr[p] && j>begin) {
j--;
}
if(i<j) {//如果i和j都停止之后尚未相遇就交换它们指示的数组值
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
int temp = arr[p];
arr[p] = arr[j];
arr[j] = temp;
quickSort(arr, begin, j-1);
quickSort(arr,j+1,end);
}
}
完。
--------------------------------------------以下是草稿纸------------------------------------------------
(原来的代码如下)
package cn.edu.nju.zyf.quicksort;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {4,65,1,78,65,29,3,9,41,5,7,16,2,3,798,45,0,6,9,45,12,54};
quickSort(arr,0,arr.length-1);
for(int i = 0;i<arr.length;i++) {
System.out.print(arr[i]+" ");
}
}
public static void quickSort(int arr[], int begin, int end) {
System.out.println("begin="+begin+",end="+end);
if(begin<0) return;
if(end < 0) return;
if(begin>=end) return;
int i = begin;
int j = end+1;
int p = begin;
while(i<j) {
i++;
j--;
System.out.println("i="+i+",j="+j);
while( arr[i]<=arr[p] && i<end) {
i++;
}
while( arr[j]>arr[p] && j>begin) {
j--;
}
System.out.println("i="+i+",j="+j);
if(i<j) {//如果i和j都停止之后尚未相遇就交换它们指示的数组值
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
for(int k = 0;k<arr.length;k++) {
System.out.print(arr[k]+" ");
}
System.out.println();
}
int temp = arr[p];
arr[p] = arr[j];
arr[j] = temp;
for(int k = 0;k<arr.length;k++) {
System.out.print(arr[k]+" ");
}
System.out.println();
quickSort(arr, begin, j-1);
quickSort(arr,j+1,end);
}
}
(输出如下)
begin=0,end=21
i=1,j=21
i=1,j=16
4 0 1 78 65 29 3 9 41 5 7 16 2 3 798 45 65 6 9 45 12 54
i=2,j=15
i=3,j=13
4 0 1 3 65 29 3 9 41 5 7 16 2 78 798 45 65 6 9 45 12 54
i=4,j=12
i=4,j=12
4 0 1 3 2 29 3 9 41 5 7 16 65 78 798 45 65 6 9 45 12 54
i=5,j=11
i=5,j=6
4 0 1 3 2 3 29 9 41 5 7 16 65 78 798 45 65 6 9 45 12 54
i=6,j=5
i=6,j=5
4 0 1 3 2 3 29 9 41 5 7 16 65 78 798 45 65 6 9 45 12 54
3 0 1 3 2 4 29 9 41 5 7 16 65 78 798 45 65 6 9 45 12 54
begin=0,end=4
i=1,j=4
i=4,j=4
3 0 1 3 2 4 29 9 41 5 7 16 65 78 798 45 65 6 9 45 12 54
2 0 1 3 3 4 29 9 41 5 7 16 65 78 798 45 65 6 9 45 12 54
begin=0,end=3
i=1,j=3
i=3,j=2
2 0 1 3 3 4 29 9 41 5 7 16 65 78 798 45 65 6 9 45 12 54
1 0 2 3 3 4 29 9 41 5 7 16 65 78 798 45 65 6 9 45 12 54
begin=0,end=1
i=1,j=1
i=1,j=1
1 0 2 3 3 4 29 9 41 5 7 16 65 78 798 45 65 6 9 45 12 54
0 1 2 3 3 4 29 9 41 5 7 16 65 78 798 45 65 6 9 45 12 54
begin=0,end=0
begin=2,end=1
begin=3,end=3
begin=5,end=4
begin=6,end=21
i=7,j=21
i=8,j=20
0 1 2 3 3 4 29 9 12 5 7 16 65 78 798 45 65 6 9 45 41 54
i=9,j=19
i=12,j=18
0 1 2 3 3 4 29 9 12 5 7 16 9 78 798 45 65 6 65 45 41 54
i=13,j=17
i=13,j=17
0 1 2 3 3 4 29 9 12 5 7 16 9 6 798 45 65 78 65 45 41 54
i=14,j=16
i=14,j=13
0 1 2 3 3 4 29 9 12 5 7 16 9 6 798 45 65 78 65 45 41 54
0 1 2 3 3 4 6 9 12 5 7 16 9 29 798 45 65 78 65 45 41 54
begin=6,end=12
i=7,j=12
i=7,j=9
0 1 2 3 3 4 6 5 12 9 7 16 9 29 798 45 65 78 65 45 41 54
i=8,j=8
i=8,j=7
0 1 2 3 3 4 6 5 12 9 7 16 9 29 798 45 65 78 65 45 41 54
0 1 2 3 3 4 5 6 12 9 7 16 9 29 798 45 65 78 65 45 41 54
begin=6,end=6
begin=8,end=12
i=9,j=12
i=11,j=12
0 1 2 3 3 4 5 6 12 9 7 9 16 29 798 45 65 78 65 45 41 54
i=12,j=11
i=12,j=11
0 1 2 3 3 4 5 6 12 9 7 9 16 29 798 45 65 78 65 45 41 54
0 1 2 3 3 4 5 6 9 9 7 12 16 29 798 45 65 78 65 45 41 54
begin=8,end=10
i=9,j=10
i=10,j=10
0 1 2 3 3 4 5 6 9 9 7 12 16 29 798 45 65 78 65 45 41 54
0 1 2 3 3 4 5 6 7 9 9 12 16 29 798 45 65 78 65 45 41 54
begin=8,end=9
i=9,j=9
i=9,j=8
0 1 2 3 3 4 5 6 7 9 9 12 16 29 798 45 65 78 65 45 41 54
0 1 2 3 3 4 5 6 7 9 9 12 16 29 798 45 65 78 65 45 41 54
begin=8,end=7
begin=9,end=9
begin=11,end=10
begin=12,end=12
begin=14,end=21
i=15,j=21
i=21,j=21
0 1 2 3 3 4 5 6 7 9 9 12 16 29 798 45 65 78 65 45 41 54
0 1 2 3 3 4 5 6 7 9 9 12 16 29 54 45 65 78 65 45 41 798
begin=14,end=20
i=15,j=20
i=16,j=20
0 1 2 3 3 4 5 6 7 9 9 12 16 29 54 45 41 78 65 45 65 798
i=17,j=19
i=17,j=19
0 1 2 3 3 4 5 6 7 9 9 12 16 29 54 45 41 45 65 78 65 798
i=18,j=18
i=18,j=17
0 1 2 3 3 4 5 6 7 9 9 12 16 29 54 45 41 45 65 78 65 798
0 1 2 3 3 4 5 6 7 9 9 12 16 29 45 45 41 54 65 78 65 798
begin=14,end=16
i=15,j=16
i=16,j=16
0 1 2 3 3 4 5 6 7 9 9 12 16 29 45 45 41 54 65 78 65 798
0 1 2 3 3 4 5 6 7 9 9 12 16 29 41 45 45 54 65 78 65 798
begin=14,end=15
i=15,j=15
i=15,j=14
0 1 2 3 3 4 5 6 7 9 9 12 16 29 41 45 45 54 65 78 65 798
0 1 2 3 3 4 5 6 7 9 9 12 16 29 41 45 45 54 65 78 65 798
begin=14,end=13
begin=15,end=15
begin=17,end=16
begin=18,end=20
i=19,j=20
i=19,j=20
0 1 2 3 3 4 5 6 7 9 9 12 16 29 41 45 45 54 65 65 78 798
i=20,j=19
i=20,j=19
0 1 2 3 3 4 5 6 7 9 9 12 16 29 41 45 45 54 65 65 78 798
0 1 2 3 3 4 5 6 7 9 9 12 16 29 41 45 45 54 65 65 78 798
begin=18,end=18
begin=20,end=20
begin=22,end=21
0 1 2 3 3 4 5 6 7 9 9 12 16 29 41 45 45 54 65 65 78 798
今天我要用实力来证明我的弱小