非比较排序

来源:互联网 发布:mysql 自动分区 编辑:程序博客网 时间:2024/06/05 08:16

非比较排序有:1.计数排序(适用于要排序的数的范围不大时)  ,以数组中的数据为key值,得到它们出现的次数,

                         然后根据它们出现的次数进行重新排列,得到它们的有序数列。相当于哈希表的直接定址法。

                         2.基数排序   LSD-- Least Significant Digit first 
                                             MSD-- Most Significant Digit first  , 首先根据个位的数值,在遍历数组数据时将他们 分配到0~9号的桶(个位与桶号一一对应)中,接下来将桶中按桶号由小到大一次重新收集到数组中,接着,再根据十位上的数值进行分配,重复这个过程,直到排到最大位的数据,得到有序数列。

 实现代码如下:
1.计数排序:               
void CountSort(int *a, size_t size){assert(a);int max = a[0];int min = a[0];for (int i = 0; i < size; i++){if (a[i] > max){max = a[i];}else if (a[i] < min){min = a[i];}}int len = max - min + 1;int *countArr = new int[len];memset(countArr, 0, sizeof(int)*len);for (int i = 0; i < size; i++){countArr[a[i] - min]++;}int tmp = 0;for (int i = 0; i < len; i++){while (countArr[i]--){a[tmp++] = i + min;}}}

2.基数排序:
int GetMaxDigit(int *a, size_t size){int digit = 1;int max = 10;for (int i = 0; i < size; i++){if (a[i] >= max){digit++;max *= 10;}}return digit;}//基数排序void LSDSort(int *a, size_t size){int maxdigit = GetMaxDigit(a, size);int *bucket = new int[size];int count[10];int start[10];int bit = 1;int digit = 1;while (bit <= maxdigit){memset(count, 0, sizeof(int)* 10);memset(start, 0, sizeof(int)* 10);for (int i = 0; i < size; i++){int num = (a[i]/digit) % 10;count[num]++;}start[0] = 0;for (int i = 1; i < size; i++){start[i] = start[i - 1] + count[i - 1];}for (int i = 0; i < size; i++){int num = (a[i] / digit) % 10;bucket[start[num]++] = a[i];}memcpy(a, bucket, sizeof(int)*size);digit *= 10;bit++;}}

1 0