#include<stdio.h >
#include<stdlib.h>
#include<time.h>
#define N 6
int* generateArray(int n){
int *a=(int*)malloc(sizeof(int)*n);
srand((unsigned)time(NULL));
for(int i=0;i<n;i++){
a[i]=rand()%20;
}
return a;
}
void quicksort(int *a,int left,int right){
int key=a[left];
int start=left,end=right;
if(left>=right) return;
//快速排序的单趟过程
//注意等号
while(left<right) {
//(6)576(2)->65(7)6(2)-> 652(6)(7)->
//对于hoare版本的单趟排序过程 ,加入left<right这个条件,能够保证左右指针不会越过对方,所以从左右开始都可以
//实际上对于等号没有严格的限制只要保证两个指针不会超过对方就可以
//如果是 while(key<=a[right]&&lef<right) right--;也可
while(key<a[right]) right--;//如果此处包括等号,如果right左移,可能会移到key所在的位置,会数组越界出错
while(a[left]<=key&&left<right) left++;//如果此处不包括等号,left数组会被卡在第一个位置不能移动。还存在一种情况,如果left移动到right所在位置,如果继续移动没有意义
int temp=a[left];
a[left]=a[right];
a[right]=temp;
}
//此时left应该和right处于同一位置
a[start]=a[left];
a[left]=key;
// printf("此次单趟内容排序见下:\n");
// for(int i=0;i<N;i++){
// printf("%d,",a[i]);
// }
// printf("\n");
quicksort(a,start,left-1);
quicksort(a,left+1,end);
}
int main(){
int *a=generateArray(N);
printf("数组内容见下:\n");
for(int i=0;i<N;i++){
printf("%d,",a[i]);
}
for(int i=0;i<6;i++) a[i]=6-i;
quicksort(a,0,N-1);
printf("排序后数组内容见下:\n");
for(int i=0;i<N;i++){
printf("%d,",a[i]);
}
return 0;
}
快速排序代码
最新推荐文章于 2025-05-23 16:30:05 发布