国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【數據結構】非比較排序--計數排序和基數排序

2019-11-06 06:06:44
字體:
來源:轉載
供稿:網友

非比較排序

1、思想 不需要進行元素之間的比較,交換,在線性的時間內完成排序。2、分類 1)計數排序 2)基數排序3、優缺點 要求的空間比較多,是典型的以空間換時間的一種做法

計數排序

1、原理 這里寫圖片描述2、代碼實現#include<iostream>using namespace std; void CountSort(int* a,int n){ //1、首先確定要開一個多大的用于統計的數組 int size = 0; int min = a[0]; int max = a[0]; for(int i = 0; i<n; i++) { if(a[i] < min) min = a[i]; if(a[i] > max) max = a[i]; } size = max-min+1; //2、開始進行統計原數組中對應下標出現的數 int* count = new int[size]; memset(count,0,sizeof(int)*size); for(int i = 0; i<n; i++) { count[a[i]-min]++; } //3、遍歷哈希表,將count數組中大于0的數對應出原數組的值, //寫入原數組中 int j = 0; for(int i = 0; i<size; i++) { while(count[i]--) { a[j++] = i+min; } } delete[] count;}//測試函數void TestCountSort(){ int a[10] = {2,5,3,8,3,7,10,9,4,0}; int sz = sizeof(a)/sizeof(a[0]); CountSort(a,sz); for(int i = 0; i<sz; i++) { cout<<a[i]<<" "; } cout<<endl;}

4、時間復雜度和空間復雜度 時間復雜度:O(N) 空間復雜度:O(k)(其中K為要排序的數組的范圍)

5、優缺點 1)缺點:由于計數排序的計數數組的大小是取決于數據的范圍,那么當要進行排序的數據范圍很大時,就需要大量的時間和內存。 2)優點: A:無需進行比較,所以時間上快于任何的比較排序。 B:適用于數據比較集中的數據排序


基數排序

1、原理 這里寫圖片描述2、分類: LSD–從低位向高位排 MSD–從高位向低位排3、代碼實現#include<iostream>using namespace std; //給一個數,求這個數有多少位int GetDigit(int* a,size_t n){ int base = 10; int digit = 1; int num = 0; for(int i = 0; i<n; i++) { while(a[i] >= base) { digit++; base *= 10; } } return digit;}void LSDdigit(int* a,int n){ int digit = GetDigit(a,n); //得到位數 int count[10] = {0}; int start[10] = {0}; int base = 1; //開辟一個新的數組,用于存放一次排序后的數 int*temp = new int[n]; while(digit--) { //首先按各位進行統計個位上的數出現的次數 for(int i = 0; i<n; i++) { int num = (a[i]/base)%10; count[num]++; } start[0] = 0; for(int i = 1; i<10; i++) { start[i] = start[i-1]+count[i-1]; } for(int i = 0; i<10; i++) { int num = (a[i]/base)%10; temp[start[num]++] = a[i]; count[num]--; } for(int i = 0; i<10; i++) { a[i] = temp[i]; } base *= 10; } delete[] temp; }//測試函數void TestLSDdigit(){ int a[10] = {73,22,93,43,55,14,28,65,39,81}; int sz = sizeof(a)/sizeof(a[0]); LSDdigit(a,sz); for(int i = 0; i<sz; i++) { cout<<a[i]<<" "; } cout<<endl;}4、時間復雜度和空間復雜度 時間復雜度:O(N*digit) 空間復雜度:O(N)

5、適用性

基數排序更適合用于對時間、字符串等這些整體權值未知的數據進行排序。注意:基數排序如果從高位向低位排的話會很麻煩

6、缺點 由于是空間換取時間,按位進行排序,那么每一位的數的位置可能會發生巨大的變化,目前硬件的緩存不是很占優勢,并且當內存比較寶貴的時候,就不要采取這種方式進行排序了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 崇礼县| 广水市| 怀集县| 泗阳县| 延吉市| 威远县| 东乌珠穆沁旗| 大悟县| 视频| 灵川县| 吕梁市| 广宗县| 洪江市| 汉川市| 文水县| 绥阳县| 特克斯县| 新闻| 福贡县| 颍上县| 长丰县| 百色市| 阿鲁科尔沁旗| 仲巴县| 邛崃市| 五峰| 宁陵县| 青田县| 周至县| 雷山县| 瑞金市| 吉隆县| 荆州市| 玉门市| 藁城市| 六安市| 通辽市| 清镇市| 睢宁县| 清涧县| 娄烦县|