#include <stdio.h>
#include <stdlib.h>
#define random(x) (rand()%x)
/*
* xiaoyang 2011-9-22
* sort algrithms
*/
void config(int* data, int len)
{
int i = 0;
srand((int)time(0));
for(i = 0; i < len; i++){
data[i] = random(2000);
}
}
void print(int* data,int len)
{
int i = 0;
printf("---------------\n");
for(i = 0; i < len; i++){
printf("%d ",data[i]);
if(i%20 == 19){
printf("\n");
}
}
}
void swapx(int *data, int x, int y)
{
int tmp = data[x];
data[x] = data[y];
data[y] = tmp;
}
/*
* quick sort, partition
*/
int quick_sort_parti(int* data,int begin,int end)
{
int x = data[begin];
int lbegin = begin+1;
int pos = begin;
int tmp = 0;
if(begin+1 >= end)
return 0;
/*保证判断元素的变化*/
swapx(data,begin,end-1);
x = data[begin];
for(pos=begin+1; pos < end; pos++){
if(data[pos] <= x){
swapx(data,lbegin,pos);
lbegin++;
}else{
}
}
/*保证切分的两部分都有元素*/
if( (lbegin-begin) >= 1 ){
swapx(data,begin,lbegin-1);
}
lbegin--;
return lbegin;
}
void quick_sort(int* data,int begin,int end)
{
int mid;
if(begin+1 >= end)
return ;
mid = quick_sort_parti(data,begin,end);
//printf("\n[%d,%d],mid=%d\n",begin,end,mid);
//print(data,end-begin);
quick_sort(data,begin,mid);
//printf("\n[%d,%d]\n",begin,mid-1);
//print(data,mid-1-begin);
quick_sort(data,mid,end);
//printf("\n[%d,%d]\n",mid,end);
//print(data,end-mid);
}
/*
* main
*/
int main()
{
const int count = 100;
int data[count];
config(data,count);
print(data,count);
printf("\nbegin\n---------------\n");
quick_sort(data,0,count);
printf("\nend\n---------------\n");
print(data,count);
return 0;
}