感觉到编写代码过程中时常会用到排序,但是有些时候对于运行时间的要求会导致一些排序算法没有办法使用
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;
}