几个好用的排序方法?

感觉到编写代码过程中时常会用到排序,但是有些时候对于运行时间的要求会导致一些排序算法没有办法使用

在这里插入图片描述
1.冒泡排序应该是最好理解也是比较简单写出来的方法

思路就是从第一个元素开始,前一个和后一个比较大小(排序方式当然自己决定),之后换位置就好了。

主要就是两个循环,内层 j 循环就是从0开始一直比较直到 n-i 。为什么是n-i呢,这是为了减少重复工作。因为第一次做这个循环的时候可以看做从0到n-1都比较了一次,已经确定了最后一个位置的数是多少,就不需要再判断了。

直观一点 29 12 43 67 23
29>12交换 12 29 43 67 23
29<43 不交换 12 29 43 67 23
43<67 不交换12 29 43 67 23
67>23 交换 12 29 43 23 67
所以说最大的就到最后了嘛,所以下一次就不用比n-2和n-1位置的数了。

void bubblesort(int score[],int n){
 	int temp;
 	for(int i=1;i<n;i++){
  		for(int j=0;j<n-i;j++){
   			if(score[j]>score[j+1]){
    				temp=score[j];
    				score[j]=score[j+1];
    				score[j+1]=temp;
   			}
  		}
 	}
 
}

虽然简单,代价就是复杂度太大了,毕竟两层嵌套的循环,怎么想都不会太低。

选择排序,插入排序就没必要了(除非指定用),不然按照上面表里面的数据来看,三者基本差不多,那为什么不选简单的冒泡排序呢

2.希尔排序
这个理解起来有一点困难
通常来说,排序都是前一个比后一个比个大小交换位置。希尔排序就脑洞大开,索性不前一个比后一个了,直接把整个数组分成n/2个,n/4个,n/8个。。。最后是前后相邻排序。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

void shellsort(int score[],int n){
 	int gap,preIndex,temp;
 	gap=n/2;
	while(gap>0){
  		for(int i=gap;i<n;i++){
   		temp=score[i];
   		preIndex=i-gap;
   		if(score[preIndex]>temp){
    			score[preIndex+gap]=score[preIndex];
    			score[preIndex]=temp;
   		}
  	}
  	gap/=2;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值