1 //冒泡排序 2 //它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来 3 //每循环一次,最大值移到最右边 4 void bubble_sort(int* arr, int len) { 5 int i, j, temp; 6 for (i = 0; i < len - 1; i++) { 7 for (j = 0; j < len - 1 - i; j++) { 8 if (arr[j] > arr[j + 1]) { 9 temp = arr[j + 1]; 10 arr[j + 1] = arr[j]; 11 arr[j] = temp; 12 } 13 } 14 } 15 } 16 17 18 //选择排序 19 //首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置, 20 //然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 21 //以此类推,直到所有元素均排序完毕。 22 void selection_sort(int* arr, int len) { 23 int i, j, temp, min; 24 for (i = 0; i < len; i++) { 25 min = i; 26 for (j = i; j < len; j++) { 27 if (arr[min] > arr[j]) { 28 min = j; 29 } 30 } 31 if (min != i) { 32 temp = arr[min]; 33 arr[min] = arr[i]; 34 arr[i] = temp; 35 } 36 } 37 } 38 39 40 //插入排序 41 //通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 42 void insert_sort(int* arr, int len) { 43 int temp, i, j; 44 for (i = 1; i < len; i++) { 45 temp = arr[i]; 46 for (j = i - 1; j >= 0 && arr[j] > temp; j--) { 47 arr[j + 1] = arr[j]; 48 } 49 arr[j + 1] = temp; 50 } 51 } 52 53 54 //希尔排序——进阶版插入排序 55 //先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序, 56 //待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序 57 void shell_sort(int* arr, int len) { 58 int i, j, gap; 59 int temp; 60 for (gap = len >> 1; gap > 0; gap >>= 1) { 61 for (i = gap; i < len; i++) { 62 temp = arr[i]; 63 for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap) { 64 arr[j + gap] = arr[j]; 65 } 66 arr[j + gap] = temp; 67 } 68 } 69 } 70 71 72 //快速排序——递归法 73 void swap(int* a, int* b) { //交换数值 74 int temp = *a; 75 *a = *b; 76 *b = temp; 77 } 78 79 void quick_sort_recursive(int *arr, int start, int end) { 80 if (start >= end) { 81 return; 82 } 83 int mid = arr[end]; 84 int left = start, right = end - 1; 85 while (left < right) { 86 while (arr[left] < mid && left < right) { 87 left++; 88 } 89 while (arr[right] > mid && left < right) { 90 right--; 91 } 92 swap(&arr[left], &arr[right]); 93 } 94 if (arr[left] > arr[end]) { 95 swap(&arr[left], &arr[end]); 96 } 97 else 98 { 99 left++; 100 } 101 if (left) { 102 quick_sort_recursive(arr, start, left - 1); 103 } 104 quick_sort_recursive(arr, left + 1, end); 105 } 106 107 void quick_sort(int* arr, int len) { 108 quick_sort_recursive(arr, 0, len - 1); 109 } 110 111 112 //计数排序 113 void counting_sort(int* arr, int *sorted_arr, int len) { 114 int* count_arr = (int*)malloc(sizeof(int) * 100); 115 memset(count_arr, 0, sizeof(int) * 100); 116 int k = 0; 117 for (int i = 0; i < len; i++) { 118 count_arr[arr[i]]++; 119 } 120 for (int j = 0; j < 100; j++) { 121 while (count_arr[j] != 0) { 122 sorted_arr[k++] = j; 123 count_arr[j]--; 124 } 125 } 126 free(count_arr); 127 }