学习到的排序算法的总结,包括对COMP20003中排序部分进行总结,部分图片来自COMP20003

有部分内容来自http://www.cnblogs.com/eniac12/p/5329396.html 

演示动画:https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html


 

概念:

stable sort: 相同的值排序后相对顺序不变。

排序算法(sorting)

Comparison-based sorting is Ω(nlogn).


Hash function ---

用数对list中的元素求余,根据余值放入对应的桶(bucket)中,使用素数(prime)能使得分配更为均匀。

Collisions冲突:两个元素的余值相同时发生。当buckets数量<元素数量,则一定发生。1个好的hash function应尽量少出现collison,但不能认为collision不会发生,换言之要做好应对。

Collision Resolution Methods

  1.Chaining

排序算法(sorting)

排序算法(sorting)

 

最坏情况:所有值都在同一bucket,实际上为linked list。

2.Open addressing methods

    • Linear probing

当插入位置已有数据时,插入下一空余位置(循环),若全满了,则collision

    • Double hashing

当插入位置已有数据时,进行第二次求余得出新的位置。注意第二次求余值要+1避免在仍在原地。

排序算法(sorting)

 

 

 


 

Distribution counting --- unusual approach to sorting

  计数排序(Counting sort):

requires: Key values to be within a certain range, lower to upper. 要排序的值在一定范围内。

通过记录所有数中,比该数小的有几个,来安排其位置。可以用辅助数组(auxiliary array)记录范围内比该值小(大)的有几个,也可以用for循环。用于整数排序

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 int *countSort(int *n, int size);
  5 int *countSortIterative(int *n, int size);
  6 void printArray(int *n, int size);
  7 int min(int *n, int size);
  8 int max(int *n, int size);
  9 
 10 int main(int argc, char **argv) {
 11     int size = 16;
 12     int unsortedArray[16] = {4,4,2,2,0,2,1,3,2,4,3,1,4,3,1,4};
 13     int *sortedArray = NULL;
 14     printArray(unsortedArray, size);
 15     //sortedArray = countSort(unsortedArray, size);
 16     sortedArray = countSortIterative(unsortedArray, size);
 17     printArray(sortedArray, size);
 18     free(sortedArray);
 19     return 0;
 20 } 
 21 
 22 void printArray(int *n, int size) {
 23     int i = 0;
 24     for (i = 0; i < size; i++) {
 25         printf("%d  ", n[i]);
 26     }
 27     printf("\n");
 28 }
 29 
 30 int *countSortIterative(int *n, int size) {
 31     int i = 0, j = 0;
 32     int *sortedArray = NULL;
 33     int count = 0;
 34     
 35     if((sortedArray = (int *) calloc(size, sizeof(int))) == NULL) {
 36         printf("calloc error\n");
 37         exit(EXIT_FAILURE);
 38     }
 39     
 40     for (i = 0; i < size; i++) {
 41         for (j = 0, count = 0; j < size; j++) {
 42             if (i == j) {
 43                 continue;
 44             }
 45             if (n[i] > n[j]) {
 46                 count++;
 47             }
 48             if (i > j && n[i] == n[j]) {
 49                 count++;
 50             }
 51         }
 52         sortedArray[count] = n[i];
 53     }
 54     return sortedArray;
 55 }
 56 
 57 int *countSort(int *n, int size) {
 58     int rangeFrom, rangeTo;
 59     int *cumulativeRecord = NULL;
 60     int *sortedArray = NULL;
 61     int i = 0;
 62     
 63     rangeFrom = min(n, size);
 64     rangeTo = max(n, size);
 65     printf("size is %d, min is %d, max is %d\n", size, rangeFrom, rangeTo);
 66     
 67     if((cumulativeRecord = (int *) calloc(rangeTo - rangeFrom + 1, sizeof(int))) == NULL) {
 68         printf("calloc error\n");
 69         exit(EXIT_FAILURE);
 70     }
 71     for (i = 0; i < size; i++) {
 72         cumulativeRecord[n[i] - rangeFrom]++;
 73     }
 74     for(i = 0; i < rangeTo - rangeFrom + 1; i++) {
 75         if (i == 0) {
 76             continue;
 77         }
 78         cumulativeRecord[i] = cumulativeRecord[i] + cumulativeRecord[i - 1];
 79     }
 80     //printArray(cumulativeRecord, rangeTo - rangeFrom + 1);
 81     if((sortedArray = (int *)malloc(size * sizeof(int))) == NULL) {
 82         printf("malloc error\n");
 83         exit(EXIT_FAILURE);
 84     } 
 85 
 86     for ( i = 0; i < size; i++) {
 87         sortedArray[cumulativeRecord[n[i] - rangeFrom]-1] = n[i];
 88         cumulativeRecord[n[i] - rangeFrom] --;
 89     }
 90     //printArray(sortedArray, size);
 91     free(cumulativeRecord);
 92     return sortedArray;
 93 }
 94 
 95 int min(int *n, int size) {
 96     int i = 0;
 97     int min = n[0];    
 98     for (i = 1; i < size; i++) {
 99         if (min > n[i]) {
100             min = n[i];
101         }
102     }
103     return min;
104 }
105 int max(int *n, int size) {
106     int i = 0;
107     int max = n[0];    
108     for (i = 1; i < size; i++) {
109         if (max < n[i]) {
110             max = n[i];
111         }
112     }
113     return max;
114 }
View Code

相关文章:

  • 2021-11-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-09
  • 2022-03-06
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-07-17
  • 2021-12-04
  • 2021-05-09
  • 2021-12-15
  • 2021-12-13
相关资源
相似解决方案