#include <stdio.h>
#include <stdlib.h>
#include<time.h>
int quicksort(int [] ,int ,int );
int partition(int [],int ,int );
void swap(int arr[],int i ,int r);
randmized_partition(int arr[],int p,int r);
int random_number(int ,int );
#define SIZE 30
int main(void)
{
int *arr=(int *)malloc(SIZE*sizeof(int));
srand(time(0));
for(int i=0;i<SIZE;i++)
arr[i]=random_number(0,2*SIZE);
printf("Before Sorting\n");
for (int i=0;i<SIZE;i++)
{
printf("%5d",arr[i]);
if((i+1)%10==0)
putchar('\n');
}
putchar('\n');
double time_start=clock();
quicksort(arr,0,SIZE-1);
double time_end=clock();
printf("After Sorting\n");
for (int i=0;i<SIZE;i++)
{
printf("%5d",arr[i]);
if((i+1)%10==0)
putchar('\n');
}
putchar('\n');
printf("Consume:%.2f",(time_end-time_start)/CLOCKS_PER_SEC);
free(arr);
}
//随机选取主元素
randmized_partition(int arr[],int p,int r)
{
int i=random_number(p,r);
swap(arr,i,r);
return partition(arr,p,r);
}
int quicksort(int *pt ,int p,int r)
{ if (p<r)
{ int q=randmized_partition(pt,p,r);
quicksort(pt,p,q-1);
quicksort(pt,q+1,r);
}
}
int partition(int * pt,int p,int r)
{ int x=pt[r];
int i =p-1;
for(int j=p;j<=r-1;j++)
{ if(pt[j]<=x)
{ i++;
swap(pt, i,j);
}
}
swap(pt,i+1,r);
return i+1;
}
//交换下标为i,r的两个元素
void swap(int arr[],int i ,int r)
{ int temp=arr[i];
arr[i]=arr[r];
arr[r]=temp;
}
//生成p,r之间的随机数(包括p,r)随机数
int random_number(int p ,int r)
{ return p+rand()%(r-p+1);
}