今晚闲着,热热身,写了个快排。重新理解了一遍快排。快排的过程可以理解为一棵树,最乐观的情况是每次基准数放在中间,刚好二分这片数列,则树的高度为lg(n),树的每层有
n个点,每个点访问一次,所以复杂度为n*lg(n);悲观情况是每片数列分为1,n-1,树高变成n,复杂度退化成n*n。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void swap(int* numa,int* numb)
{
int numc;
numc=*numa;
*numa=*numb;
*numb=numc;
}
int partition(int* num,int left,int right)//比pivot小的数,放最左边。
{
int StoreIndex=left;
int i;
for(i=left;i<right;i++)
{
if(num[i]<num[right])
{
swap(&num[StoreIndex],&num[i]);
StoreIndex++;
}
}
swap(&num[StoreIndex],&num[right]);
return StoreIndex;
}
void quicksort(int* num,int left,int right)
{
int pivot;
if(left<right)
{
pivot=partition(num,left,right);
quicksort(num,left,pivot-1);
quicksort(num,pivot+1,right);
}
}
int main()
{
int n;
int* num;
int i;
srand(time(NULL));
while(scanf("%d",&n)!=EOF)
{
num=(int*)malloc(n*4+4);
for(i=0;i<n;i++)
{
num[i]=rand()%1000;
}
quicksort(num,0,n-1);
for(i=0;i<n;i++)
{
printf("%d%s",num[i],(i!=n-1)? " " : "");
}
printf("\n");
}
return 0;
}
quicksort
最新推荐文章于 2024-05-14 10:51:55 发布