必须知道的C语言八大排序算法(收藏)

2020-01-06 17:55:59刘景俊

最高位优先(Most Significant Digit first)法,简称MSD 法:

1)先按k1 排序分组,将序列分成若干子序列,同一组序列的记录中,关键码k1 相等。

2)再对各组按k2 排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd 对各子组排序后。

3)再将各组连接起来,便得到一个有序序列。扑克牌按花色、面值排序中介绍的方法一即是MSD 法。

最低位优先(Least Significant Digit first)法,简称LSD 法:

1) 先从kd 开始排序,再对kd-1进行排序,依次重复,直到按k1排序分组分成最小的子序列后。

2) 最后将各个子序列连接起来,便可得到一个有序的序列, 扑克牌按花色、面值排序中介绍的方法二即是LSD 法。

基于LSD方法的链式基数排序的基本思想

  “多关键字排序”的思想实现“单关键字排序”。对数字型或字符型的单关键字,可以看作由多个数位或多个字符构成的多关键字,此时可以采用“分配-收集”的方法进行排序,这一过程称作基数排序法,其中每个数字或字符可能的取值个数称为基数。比如,扑克牌的花色基数为4,面值基数为13。在整理扑克牌时,既可以先按花色整理,也可以先按面值整理。按花色整理时,先按红、黑、方、花的顺序分成4摞(分配),再按此顺序再叠放在一起(收集),然后按面值的顺序分成13摞(分配),再按此顺序叠放在一起(收集),如此进行二次分配和收集即可将扑克牌排列有序。   

基数排序:

是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。

算法实现:


Void RadixSort(Node L[],length,maxradix) 
{ 
 int m,n,k,lsp; 
 k=1;m=1; 
 int temp[10][length-1]; 
 Empty(temp); //清空临时空间 
 while(k<maxradix) //遍历所有关键字 
 { 
 for(int i=0;i<length;i++) //分配过程 
 { 
 if(L[i]<m) 
 Temp[0][n]=L[i]; 
 else 
 Lsp=(L[i]/m)%10; //确定关键字 
 Temp[lsp][n]=L[i]; 
 n++; 
 } 
 CollectElement(L,Temp); //收集 
 n=0; 
 m=m*10; 
 k++; 
 } 
} 

总结

各种排序的稳定性,时间复杂度和空间复杂度总结:

c语言,八大排序算法,c语言排序算法

我们比较时间复杂度函数的情况: