算法实现:
quicksort.c
#include <stdio.h>
void display(int* arr,int len){
int i = 0;
for(i=0;i<len;i++){
printf("%d,",arr[i]);
}
printf("\n");
}
void quicksort(int* arr, int l, int r){
printf("l: %d, r:%d\n",l,r);
int bp = l+1, ep = r;
int tmp = arr[l],t=0;
if(l>=r) return;
// printf("bp: %d, ep: %d\n",bp,ep);
while(bp!=ep){
while(arr[ep]>=tmp && bp<ep){
ep--;
}
while(arr[bp]<=tmp && bp<ep){
bp++;
}
printf("bp:%d,ep:%d",bp,ep);
getchar();
display(arr,r);
if(bp<ep){
printf(" %d <==> %d \n",arr[bp],arr[ep]);
t=arr[bp];
arr[bp]=arr[ep];
arr[ep]=t;
}
}
arr[l] = arr[bp];
arr[bp] = tmp;
display(arr,r);
printf("------------\n");
quicksort(arr,l,bp-1);
quicksort(arr,bp+1,r);
}
int main(){
int arr[15] = {3,4,2,5,1,9,6,7,10,11,14,13,12,0,8};
quicksort(arr,0,14);
display(arr,15);
}
l: 0, r:14
bp:1,ep:13
3,4,2,5,1,9,6,7,10,11,14,13,12,0,
4 <==> 0
bp:3,ep:4
3,0,2,5,1,9,6,7,10,11,14,13,12,4,
5 <==> 1
bp:3,ep:3
3,0,2,1,5,9,6,7,10,11,14,13,12,4,
1,0,2,3,5,9,6,7,10,11,14,13,12,4,
------------
l: 0, r:2
bp:1,ep:1
1,0,
0,1,
------------
l: 0, r:0
l: 2, r:2
l: 4, r:14
bp:5,ep:13
0,1,2,3,5,9,6,7,10,11,14,13,12,4,
9 <==> 4
bp:5,ep:5
0,1,2,3,5,4,6,7,10,11,14,13,12,9,
0,1,2,3,4,5,6,7,10,11,14,13,12,9,
------------
l: 4, r:4
l: 6, r:14
bp:7,ep:7
0,1,2,3,4,5,6,7,10,11,14,13,12,9,
0,1,2,3,4,5,7,6,10,11,14,13,12,9,
------------
l: 6, r:6
l: 8, r:14
bp:9,ep:14
0,1,2,3,4,5,7,6,10,11,14,13,12,9,
11 <==> 8
bp:10,ep:13
0,1,2,3,4,5,7,6,10,8,14,13,12,9,
14 <==> 9
bp:10,ep:10
0,1,2,3,4,5,7,6,10,8,9,13,12,14,
0,1,2,3,4,5,7,6,9,8,10,13,12,14,
------------
l: 8, r:9
0,1,2,3,4,5,7,6,8,
------------
l: 8, r:8
l: 10, r:9
l: 11, r:14
bp:13,ep:14
0,1,2,3,4,5,7,6,8,9,10,13,12,14,
14 <==> 11
bp:13,ep:13
0,1,2,3,4,5,7,6,8,9,10,13,12,11,
0,1,2,3,4,5,7,6,8,9,10,11,12,13,
------------
l: 11, r:12
0,1,2,3,4,5,7,6,8,9,10,12,
------------
l: 11, r:11
l: 13, r:12
l: 14, r:14
0,1,2,3,4,5,7,6,8,9,10,12,11,13,14,
算法思想理解:找一个分界点,让分界点左侧的元素都小于分界点,右侧都大于这个分解点,左侧和右侧可是是无序的。然后用递归分解对无序的数组在进行以上操作。需要注意的是递归的退出条件是元素下标的比较。
ps:排序算法的位置(下标)一定要十分小心。差一点都不行。