学习到的排序算法的总结,包括对COMP20003中排序部分进行总结,部分图片来自COMP20003
有部分内容来自http://www.cnblogs.com/eniac12/p/5329396.html
演示动画:https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html
概念:
stable sort: 相同的值排序后相对顺序不变。
Comparison-based sorting is Ω(nlogn).
Hash function ---
用数对list中的元素求余,根据余值放入对应的桶(bucket)中,使用素数(prime)能使得分配更为均匀。
Collisions冲突:两个元素的余值相同时发生。当buckets数量<元素数量,则一定发生。1个好的hash function应尽量少出现collison,但不能认为collision不会发生,换言之要做好应对。
Collision Resolution Methods
1.Chaining
最坏情况:所有值都在同一bucket,实际上为linked list。
2.Open addressing methods
-
- Linear probing
当插入位置已有数据时,插入下一空余位置(循环),若全满了,则collision。
-
- Double hashing
当插入位置已有数据时,进行第二次求余得出新的位置。注意第二次求余值要+1避免在仍在原地。
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 }