sort

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值