静下心来写算法(之简单排序算法)

被快排整的头疼,以后再写,先写三个简单的排序(冒泡、选择、插入)轻松一下吧
先看一下对几种排序算法的测试结果
/*
* 对10万随机数排序测试结果:
*
* 速度排名     算法       平均时间 
*
* 1       quick_sort        12  ms 
* 2       qsort             15  ms        
* 3       insert_sort     7851  ms
* 4       select_sort    11292  ms
* 5       bubble_sort    23364  ms 
*
* CPU:i3-2120 3.30GHz
*
*/ 
第一次看到这个结果时被吓到了,没想到快排跟冒泡差距有这么大,看来高效的算法在性能提升上不是一点点哦。要好好学学算法了 奋斗

1)冒泡排序


/*--------------------------------------- ------------------------------------
原理:大家都懂的 
时间复杂度:O(n^2)
描述:编写最简单,效率最低 
------------------------------------------------------------------------------*/ 
void bubble_sort(int *a,int len)
{
	int i,j,t;
	for(i=0;i<len-1;i++){
		for(j=i+1;j<len;j++){
			if(a[i]>a[j]){
				t=a[i];a[i]=a[j];a[j]=t; 
			} 
		} 
	} 
}

2)插入排序

/*--------------------------------------- ------------------------------------ 
原理:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描
      找到相应位置并插入 
时间复杂度:O(n^2)
最好情况:序列是升序排列, 比较操作需(n-1)次
最坏情况:序列是降序排列 ,比较操作需 n(n-1)/2 次
描述:插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小
      例如量级小于千,那么插入排序还是一个不错的选择。
------------------------------------------------------------------------------*/ 
void insert_sort(int *a,int len)
{
        int i,j,t;
        for(i=1;i<len;i++){
                t=a[i]; 
                j=i-1; 
                while(t<a[j]){
                        a[j+1]=a[j--];
                }
                a[j+1]=t; 
        } 
} 

3)选择排序

/*--------------------------------------- ------------------------------------
原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 
      然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾 
时间复杂度:O(n^2)
最好情况是,已经有序,交换0次
最坏情况是,逆序,交换n-1次
描述:交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多
 n值较小时,选择排序比冒泡排序快。
------------------------------------------------------------------------------*/ 
void select_sort(int *a,int len)
{
        int min_index,index,t,i; 
        for(i=0;i<len-1;i++){
                min_index=i; 
                for(index=i;index<len-1;index++){ 
                        if(a[index]<a[min_index]){
                                min_index=index; 
                        } 
                } 
                if(min_index!=i){
                        t=a[i]; 
                        a[i]=a[min_index]; 
                        a[min_index]=t;
                } 
        } 
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值