1、計數排序
(1)、算法思想
是一組在特定范圍內的整數,在線性時間內排序,比nlog(n)更快的排序算法;
較小范圍內是比較好的排序算法,如果很大是很差的排序算法;
可以解決重復元素的出現的排序算法;
(2)、代碼實現
#include<stdio.h>
void countSort(int *a, int count);
void showArray(int *a, int count);
void showArray(int *a, int count){
int i;
for(i = 0; i < count; i++){
printf("%d ", a[i]);
}
printf("\n");
}
void countSort(int *a, int count){
int b[10] = {0};
int *c;
int i;
c = (int *)malloc(sizeof(int) * count);
for(i = 0; i < count; i++){
b[a[i]]++;
}
for(i = 1; i < 10; i++){
b[i] += b[i-1];
}
for(i = count-1; i >= 0; i--){
c[b[a[i]]-1] = a[i];
b[a[i]]--;
}
for(i = 0; i < count; i++){
a[i] = c[i];
}
free(c);
}
void main(void){
int a[] = {2, 4, 7, 2, 1, 0, 9};
int count = sizeof(a)/sizeof(int);
countSort(a, count);
showArray(a, count);
}(3)、結果截圖

(4)、算法分析:
計數排序優點:穩定性(一個穩定性算法保證了相等元素的順序);
時間復雜度:O(n);
2、基數排序
(1)、算法思想
i、從最后一位(低位-->高位)開始排序,并且的是穩定的排序算法(輔助算法:計數排序),整體思想:按位排序;
ii、在進行基數排序時,從個位--->十位--->百位......每取一位時,分別進行計數排序,傳的參數:位、要排序的總數、新的結果、輔助空間(開辟10個元素的空間)、原先數組;利用位和輔助空間,將原先數組的值放入新的結果空間中即可;(位的順序與原先結果的順序保持一致)!!!
iii、基數排序只要知道最大數是幾位,進行幾次排序即可;
(2)、代碼實現
#include<stdio.h>
#include<malloc.h>
void radixSort(int *a, int count);
void countSort(int *bitNumber, int count, int *newA, int *c, int *a);
void showArray(int *a, int count);
void showArray(int *a, int count){
int i;
for(i = 0; i < count; i++){
printf("%d ", a[i]);
}
printf("\n");
}
void countSort(int *bitNumber, int count, int *newA, int *c, int *a){
int i;
//從個位-->十位-->百位,每一次調用這個函數,輔助空間都必須初始化為0;
for(i = 0; i < 10; i++){
c[i] = 0;
}
for(i = 0; i < count; i++){
c[bitNumber[i]]++;
}
for(i = 1; i < 10; i++){
c[i] += c[i-1];
}
for(i = count-1; i >= 0; i--){
newA[c[bitNumber[i]]-1] = a[i]; //a[i]與原先所取的位順序一致
c[bitNumber[i]]--;
}
}
void radixSort(int *a, int count){
int *bitNumber;
int *newA;
int c[10] = {0};
int i;
//個位進行排序
bitNumber = (int *)malloc(sizeof(int) * count);
newA = (int *)malloc(sizeof(int) * count);
for(i = 0; i < count; i++){
bitNumber[i] = a[i]%10;
}
countSort(bitNumber, count, newA, c, a); //bitNumber:代表要排的數字;newA:代表最終排行的新空間
// c:代表輔助空間 a:代表原先數字
for(i = 0; i < count; i++){
a[i] = newA[i];
}
//十位進行排序
for(i = 0; i < count; i++){
bitNumber[i] = a[i]/10%10;
}
countSort(bitNumber, count, newA, c, a);
for(i = 0; i < count; i++){
a[i] = newA[i];
}
//百位排序
for(i = 0; i < count; i++){
bitNumber[i] = a[i]/100%10;
}
countSort(bitNumber, count, newA, c, a);
for(i = 0; i < count; i++){
a[i] = newA[i];
}
//千位排序
for(i = 0; i < count; i++){
bitNumber[i] = a[i]/1000%10;
}
countSort(bitNumber, count, newA, c, a);
for(i = 0; i < count; i++){
a[i] = newA[i];
}
}
void main(void){
int a[] = {23, 1000, 90, 34, 2, 6, 3, 444, 555, 666, 777, 888, 999, 111, 222};
int count = sizeof(a)/sizeof(int);
radixSort(a, count);
showArray(a, count);
}(3)、運行結果

(4)、算法分析
時間復雜度:O(n);
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。