`
Touch_2011
  • 浏览: 287195 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

各种排序算法的实现(C语言实现)

阅读更多
/*
 * 各种基本排序算法实现(以由小到大为例)
 */

#include<stdio.h>
#define ARRAY_LENGTH 50 

//插入排序
void inseartSort(int a[],int length)
{
	int i,j,index,temp;
	for(i=0;i<length;i++){//数组a中元素逐个有序插入数组a
		for(j=0;j<i;j++) //寻找第i个元素的插入位置
			if(a[i]<a[j])
				break;
		index=j;
		temp=a[i];
		for(j=i;j>index;j--)//移位
			a[j]=a[j-1];
		a[index]=temp;
	}
}

//快速排序
void quickSort(int a[],int length)
{
    int i=0,j=length-1; //i指向数组头元素,j指向数组尾元素
	int index=0;     //指向中间值
	int m=0;         //双向搜索,判断是i加还是j减
	if(length<=0)
		return;
	while(i<=j){ //一趟快速排序
		if(!m){
            if(a[j]<a[index]){//交换a[j]和a[index]
    			a[j]=a[index]+a[j];
	    		a[index]=a[j]-a[index];
	    		a[j]=a[j]-a[index];
		     	index=j;
				m=1;
			}
        	j--;
		}else{
			if(a[i]>a[index]){
    			a[i]=a[index]+a[i];
	    		a[index]=a[i]-a[index];
	    		a[i]=a[i]-a[index];
		     	index=i;
				m=0;
			}
			i++;
		}
	}
	quickSort(a,index);
	quickSort(a+index+1,length-index-1);
}

//希尔排序
void shellSort(int a[],int length)
{
	int b[ARRAY_LENGTH]; //辅助数组
	int d,k,j,i;
	d=length/2;          //增量
	while(d>0){
		for(k=0;k<d;k++){
			j=0;
			for(i=k;i<length;i+=d)//把a中要排序的元素复制到b数组
				b[j++]=a[i];
			inseartSort(b,j);
			j=0;
			for(i=k;i<length;i+=d)//把排好序的元素放回a数组
				a[i]=b[j++];
		}
		if(d==1)//增量为1,最后一趟插入排序排完
		    break;
		d/=2;
		if(d==0)
			d=1;
	}
}

//归并排序
void mergeSort(int a[],int length)
{
	int d=2,i; //d为归并的子列中每一个子列包含的元素个数
	while(d<length){
		for(i=0;i+d<=length;i+=d) //一趟归并
			inseartSort(a+i,d);
		d*=2;
	}
	//收尾处理,因为可能有没处理完的子列(这个子列的元素个数小于d)
	inseartSort(a,length); 
}

//基数排序
void radixSort(int a[],int length)
{
	int b[ARRAY_LENGTH]; //存放a中元素取出的各个位数上的数字
	int i,index,j,temp,step=1;
    for(i=0;i<length;i++)//a中各个元素复制到b
    	b[i]=a[i];

    while(1){
    	for(i=0;i<length;i++)//取b中各个元素的个位数
    		b[i]=b[i]%10;
    	//对b数组进行排序,a数组按各个位数上的数字大小进行排序
        for(i=0;i<length;i++){
            index=i;
    		for(j=i;j<length;j++)
	    		if(b[j]<b[index])
		    		index=j;
    		temp=b[i];
    		b[i]=b[index];
     		b[index]=temp;
    		temp=a[i];
    		a[i]=a[index];
    		a[index]=temp;
		}
    	for(i=0;i<length;i++)
    		b[i]=a[i]/(10*step);

    	for(i=0;i<length;i++)//判断b中的元素是否全是0
	    	if(b[i]!=0)
	    		break;
    	if(i==length)//b中元素全是0
    		break;
		step*=10;
	}
}


/*********************** 以下是堆排序的实现 ***********************/

//筛选法调整堆,i指向要调整的元素
void sift(int a[],int length,int i)
{
	int j=2*(i+1)-1;  //j指向i的左孩子
	int index=j;    //index指向某个元素的左右孩子中较大的一个
	int temp;
	if(j>=length) //i为叶子节点
		return;
	if(j+1<length)
    	index=a[j]>a[j+1]?j:j+1;
	if(a[i]<a[index]){//如果父亲结点小于孩子结点,交换
       temp=a[i];
	   a[i]=a[index];
	   a[index]=temp;
	   sift(a,length,index); //可能破坏了左子树或右子树的排序,对子树进行筛选法调整
	}
}

//堆排序(大顶堆)
void heapSort(int a[],int length)
{
	int i; //i指向要调整的元素,从length/2开始
    int temp;

	//从length/2个元素开始调整堆
	for(i=length/2-1;i>=0;i--){
        sift(a,length,i);
	}

	//取堆顶元素,最后一个元素代替第一个元素。然后调整堆 
	for(i=length-1;i>0;i--){
		temp=a[0];
		a[0]=a[i];
		a[i]=temp;
		sift(a,i,0);
	}
}
/*********************** 以上是堆排序的实现 ***********************/


void main()
{
	int i;
	int a[]={5,3,5,6,12,33,24,10,22,8};
	int b[10];

	//待排序序列
	printf("待排序序列:");
    for(i=0;i<10;i++)
		b[i]=a[i];
	for(i=0;i<10;i++)
		printf("%-4d",b[i]);
    printf("\n\n");

	//测试插入排序
	printf("插入排序  :");
	inseartSort(b,10);
	for(i=0;i<10;i++)
		printf("%-4d",b[i]);
    printf("\n\n");

	//测试快速排序
	printf("快速排序  :");
    for(i=0;i<10;i++)
		b[i]=a[i];
	quickSort(b,10);
	for(i=0;i<10;i++)
		printf("%-4d",b[i]);
    printf("\n\n");

	//测试希尔排序
	printf("希尔排序  :");
    for(i=0;i<10;i++)
		b[i]=a[i];
	shellSort(b,10);
	for(i=0;i<10;i++)
		printf("%-4d",b[i]);
    printf("\n\n");

	//测试归并排序
	printf("归并排序  :");
    for(i=0;i<10;i++)
		b[i]=a[i];
	mergeSort(b,10);
	for(i=0;i<10;i++)
		printf("%-4d",b[i]);
    printf("\n\n");

	//测试基数排序
	printf("基数排序  :");
    for(i=0;i<10;i++)
		b[i]=a[i];
	radixSort(b,10);
	for(i=0;i<10;i++)
		printf("%-4d",b[i]);
    printf("\n\n");

	//测试堆排序
	printf("堆排序    :");
    for(i=0;i<10;i++)
		b[i]=a[i];
	heapSort(b,10);
	for(i=0;i<10;i++)
		printf("%-4d",b[i]);
    printf("\n\n");
}

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics