//quick_sort
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<string.h>
__attribute__((constructor))
void init_rand(){
srand(time(0));
return ;
}
int check(int *arr,int n){
for(int i=1;i<n;i++){
if(arr[i]<arr[i-1]) return 0;
}
return 1;
}
#define TEST(func,arr,n) __TEST(func,arr,n,#func)
void __TEST(
void (*func)(int *,int ,int),
int *arr,int n,
const char *func_name
){
int *temp=(int *)malloc(sizeof(int )*n);
memcpy(temp,arr,sizeof(int)*n);
long long b=clock();
func(temp,0,n-1);
long long e=clock();
if(check(temp,n)){
printf("ok\n");
}
else{
printf("failed\n");
}
printf("%s (%lldms)\n",func_name,1000*(e-b)/CLOCKS_PER_SEC);
free(temp);
return ;
}
void quick_sort_v1(int *arr,int l,int r){ //基础版本
if(l>=r) return ;
int x=l,y=r,z=arr[l];
while(x<y){
while(x<y && arr[y]>=z) --y;
if(x<y) arr[x++]=arr[y];
while(x<y && arr[x] <=z) ++x;
if(x<y) arr[y--]=arr[x];
}
arr[x]=z;
quick_sort_v1(arr,l,x-1);
quick_sort_v1(arr,x+1,r);
return;
}
void quick_sort_v2(int *arr,int l,int r){ //单边递归法优化
while(l<r){
int x=l,y=r,z=arr[l];
while(x<y){
while(x<y && arr[y]>=z) --y;
if(x<y) arr[x++]=arr[y];
while(x<y && arr[x]<=z) ++x;
if(x<y) arr[y--]=arr[x];
}
arr[x]=z;
quick_sort_v1(arr,l,x-1);
l=x+1;
}
return;
}
#define swap(a,b){\
__typeof(a) __c=a;\
a=b,b=__c;\
}
void insert_sort(int *arr,int l,int r){//l->r是待排序的区间范围
for(int i=l+1;i<=r;i++){
int j=i;
while(j>l &&arr[j]<arr[j-1]){ //j >l 说明 排序范围 就是监督项--》防止下标访问越界 无监督:就是干掉监督项
swap(arr[j],arr[j-1]);
j-=1;
}
}
}
void unguarded_insert_sort(int *arr,int l,int r){ //无监督思想优化
int ind=l;//全局最小值
for(int i=l+1;i<=r;i++){
if(arr[ind]>arr[i]) ind=i;
}
while(ind>l){
swap(arr[ind],arr[ind-1]);
ind-=1;
}
for(int i=l+2;i<=r;i++){
int j=i;
while(arr[j]<arr[j-1]){ //因为j 肯定> l 监督:就是干掉监督项
swap(arr[j],arr[j-1]);
j-=1;
}
}
return;
}
int *getRandData(int n){
int *arr=(int *)malloc(sizeof(int)*n);
for(int i=0;i<n;i++){
arr[i]=rand()%n;
}
return arr;
}
int main(){
#define MAX_N 100000
int *arr=getRandData(MAX_N);
TEST(quick_sort_v1,arr,MAX_N);
TEST(quick_sort_v2,arr,MAX_N);
TEST(insert_sort,arr,MAX_N);
TEST(unguarded_insert_sort,arr,MAX_N);
}
快速排序三种思想代码-基本、单边、无监督
最新推荐文章于 2023-01-09 14:26:17 发布