您好,登錄后才能下訂單哦!
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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。