C实现9种排序算法

算法复杂度以及稳定性分析

算法名称平均时间辅助空间稳定性
冒泡排序O(n2)O(1)
选择排序O(n2)O(1)
插入排序O(n2)O(1)
自底向上归并排序O(nlog2n)O(n)
自顶向下归并排序O(nlog2n)O(n)
快速排序O(nlog2n)O(n)
堆排序O(nlog2n)O(1)
基数排序O(dn)O(rn)
希尔排序\O(1)

排序的时间效率比较

下图表名了各种算法在不同数据规模下,完成排序所消耗的时间(毫秒为单位),从表中可以显然看出O(n2)的排序算法比O(nlog2n)的算 法 时间多出几百上千倍,而且随着数据数据规模增大时间比也会随着增大;因为排序的数据采用随机数,顺序将被打乱,快速排序算法优于其他排序算法!
 
算法名称1万2万3万4万5万6万7万8万9万10万
冒泡排序14425497122062186134017491486739488880111939139071
选择排序19981617903254506271669645126361610219643
插入排序17871716282882445864468822116491454717914
自底向上归并排序36912151822262833
自顶向下归并排序371115182327313640
快速排序25811141821252932
堆排序371216192326303437
基数排序9213040495966759098
希尔排序381115242429354041

下面是C代码

#include <stdio.h>
#include <stdlib.h>

#define   LENGTH(s)   (sizeof(s)/sizeof(int))
#define   SWAP(x,y) {long t; t=x; x=y; y=t;}

//冒泡排序
void BubbleSort(int **p,int len){
	int i,j;
	
	for(i=0;i<len;i++){//外层控制循环次数
		for(j=0;j<len-i;j++){//控制交换次数
			if((*p)[j]>(*p)[j+1]){
				SWAP((*p)[j],(*p)[j+1]);
			}
		}
	}
}

//选择排序
void SelectSort(int **p,int len){
	int i,j,k;
	
	for(i=0;i<len;i++){
		k=i;
		for(j=i+1;j<len;j++){
                if((*p)[k]>(*p)[j]){
            		k=j;   
                }
		}
		if(k!=i){
			SWAP((*p)[k],(*p)[i]);
		}
	}
	
}

//插入排序
void InsertSort(int **p,int len){
	int i,j,k;
	
	for(i=1;i<len;i++){
		k=(*p)[i];
		for(j=i-1;j>=0;j--){
			if((*p)[j]>k){
				(*p)[j+1]=(*p)[j];
            }else{
				break;
			}
		}
		(*p)[j+1]=k;
	}
}

//快速排序
void QuickSort(int **p,int min,int max){
	int i,j,k;
	if(min<max){
		i=min;j=max;k=(*p)[i];
		while(i<j){
			while(i<j && (*p)[j]>k)
				j--;
			if(i<j)
				(*p)[i++]=(*p)[j];

			 while(i<j && (*p)[i]<k)
				i++;
			 if(i<j)
				(*p)[j--]=(*p)[i];
		}
		(*p)[i]=k;
		QuickSort(p,min,i-1);
		QuickSort(p,i+1,max);
	}
}

void main(){
	int arr[]={1233,22,38,99,90,1,23,45,394,2,384,45,100,-10,22};
	int i,*p=arr;
	int len=LENGTH(arr);
	//BubbleSort(&p,len);
	//SelectSort(&p,len);
	//InsertSort(&p,len);
	QuickSort(&p,0,len);
	for(i=0;i<len;i++){
		printf("%d\n",arr[i]);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值