#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print(int x[],int n)
{
int i;
for (i=0;i<n;i++)
printf("%d ",x[i]);
printf("\n");
}
void shuffle(int x[],int n)
{
int i,j,t;
for (i=2;i<n;i++)
{
j = rand()%i;
t = x[j];
x[j] = x[i];
x[i] = t;
}
}
void select_sort(int x[],int n)
{
int i,j,k,t;
for (i=0;i<n-1;i++)
{
j = i;
for (k=j+1;k<n;k++)
{
if(x[k]<x[j])
{
j = k;
}
}
t = x[j];
x[j] = x[i];
x[i] = t;
}
}
void insert_sort(int x[],int n)
{
int i,j,t;
for (i=1;i<n;i++)
{
t = x[i];
for (j=i-1;j>=0 && x[j]>t;j--)
{
x[j+1] = x[j];
}
x[j+1] = t;
}
}
int partition(int x[],int begin,int end)
{
int i,j,t,p;
int last = end-1;
p = x[last];
for (i=j=begin;i<last;i++)
{
if(x[i]<p)
{
t = x[j];
x[j++] = x[i];
x[i] = t;
}
}
t = x[j];
x[j] = x[last];
x[last] = t;
return j;
}
void quick_sort_pass(int x[],int begin,int end)
{
int mid;
if(end-begin>1){
mid = partition(x,begin,end);
quick_sort_pass(x,begin,mid);
quick_sort_pass(x,mid+1,end);
}
}
void quick_sort(int x[],int n)
{
quick_sort_pass(x,0,n);
}
void shell_sort(int x[],int n)
{
int step,i,j,t;
for(step=n/2;step>=1;step/=2)
{
for (i=1;i<n;i+=step)
{
t = x[i];
for (j=i-step;j>=0 && x[j]>t;j-=step)
{
x[j+step] = x[j];
}
x[j+step] = t;
}
}
}
void merge_array(int x[],int begin,int mid,int end,int t[])
{
int i,j,k;
i = k = begin;
j = mid;
for(;;)
{
if(i>=mid)
{
while(j<end)
t[k++] = x[j++];
break;
}
if(j>=end)
{
while(i<mid)
t[k++] = x[i++];
break;
}
t[k++] = x[i]<x[j] ? x[i++] : x[j++];
}
for (i=begin;i<k;i++)
x[i] = t[i];
}
void merge_pass(int x[],int begin,int end,int t[])
{
int mid;
if(end-begin>1)
{
mid = (begin+end)/2;
merge_pass(x,begin,mid,t);
merge_pass(x,mid,end,t);
merge_array(x,begin,mid,end,t);
}
}
void merge_sort(int x[],int n)
{
int size,*t;
size = sizeof(int)*n;
t = (int*)malloc(size);
merge_pass(x,0,n,t);
free(t);
}
void bubble_sort(int x[],int n)
{
int i,j,t;
for (i=0;i<n-1;i++)
{
for (j=0;j<n-i-1;j++)
{
if (x[j]>x[j+1])
{
t = x[j+1];
x[j+1] = x[j];
x[j] = t;
}
}
}
}
void heap_push(int x[],int n,int value){
int child,parent;
child = n;
while (child>0 && x[parent=(child-1)/2]<value)
{
x[child] = x[parent];
child = parent;
}
x[child] = value;
}
int heap_pop(int x[],int n){
int parent,child,value,size,top;
top = x[0];
size = n-1;
value = x[size];
parent = 0;
while((child=parent*2+1)<size)
{
if(child+1<size && x[child+1]>x[child])
child++;
if(x[child]<value)
break;
x[parent] = x[child];
parent = child;
}
x[parent] = value;
return top;
}
void heap_sort(int x[],int n)
{
int i;
for (i=0;i<n;i++)
heap_push(x,i,x[i]);
for(i=n;i>0;i--)
x[i-1] = heap_pop(x,i);
}
void radix_sort(int x[],int n)
{
int i,m,exp,b[10],*y;
y = (int*)malloc(sizeof(int)*n);
m = x[0];
for (i=1;i<n;i++){
if(x[i]>m)
m = x[i];
}
for (exp=1;m/exp>0;exp*=10)
{
memset(b,0,sizeof(b));
for (i=0;i<n;i++)
b[(x[i]/exp)%10]++;
for (i=1;i<10;i++)
b[i] +=b[i-1];
for(i=n-1;i>=0;i--)
y[--b[(x[i]/exp)%10]] = x[i];
for(i=0;i<n;i++)
x[i] = y[i];
}
free(y);
}
int main(int argc, char* argv[])
{
int x[] = {1,4,2,1,9,5,2,3,6,8,6,2,4};
int n = sizeof(x)/sizeof(int);
printf("%d\n",n);
print(x,n);
puts("shuffle");
shuffle(x,n);
print(x,n);
puts("select_sort");
select_sort(x,n);
print(x,n);
shuffle(x,n);
puts("insert_sort");
insert_sort(x,n);
print(x,n);
shuffle(x,n);
puts("bubble_sort");
bubble_sort(x,n);
print(x,n);
shuffle(x,n);
puts("merge_sort");
merge_sort(x,n);
print(x,n);
shuffle(x,n);
puts("quick_sort");
quick_sort(x,n);
print(x,n);
shuffle(x,n);
puts("shell_sort");
shell_sort(x,n);
print(x,n);
shuffle(x,n);
puts("heap_sort");
heap_sort(x,n);
print(x,n);
shuffle(x,n);
puts("radix_sort");
radix_sort(x,n);
print(x,n);
printf("ok\n");
printf("%d\n",n);
printf("ok\n");
printf("%d\n",n);
getchar();
return 0;
}
sort
最新推荐文章于 2024-12-25 07:55:58 发布