// 冒泡法 voidbubSort(int arr[], int arrLen) { while(arrLen--) { for (int i = 0; i < arrLen; i++) { if (arr[i] > arr[i+1]) { int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } } } }
// 优化,当已经是顺序时无需再排序 voidbubSortPro(int arr[], int arrLen) { int flag = 1; while(arrLen-- && flag) { flag = 0; for (int i = 0; i < arrLen; i++) { if (arr[i] > arr[i+1]) { flag = 1; int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } } } }
voidselectSort(int arr[], int arrLen) { for (int i = 0; i < arrLen; i++) { int k = i; for (int j = (i + 1); j < arrLen; j++) { if (arr[k] > arr[j]) { k = j; // k 用于记录每轮最小值的位置 } }
if (i != k) { int temp = arr[i]; arr[i] = arr[k]; arr[k] = temp; } } }
插入排序
插入排序适用于已经基本有序的序列。
依次将数据插入前面已经排号序的序列中。
1 2 3 4 5 6 7 8 9 10 11 12 13
voidinsertSort(int arr[], int arrLen) { int i, j, temp; for (i = 1; i < arrLen; i++) { temp = arr[i]; // 要插入的数据 for (j = i; (j >= 1) && (arr[j-1] > temp); j--) // 大于 temp 的元素向后移动一位 { arr[j] = arr[j-1]; } arr[j] = temp; } }
voidmergeSort(int *arr1, int len1, int *arr2, int len2, int *temp) { int i = 0; int j = 0; int k = 0; while (i < len1 && j < len2) { if (arr1[i] < arr2[j]) { temp[k] = arr1[i]; i++; k++; } else { temp[k] = arr2[j]; j++; k++; } } // 剩下的数据直接拷贝到temp数组后即可 while (i < len1) { temp[k] = arr1[i]; i++; k++; } while (j < len2) { temp[k] = arr2[j]; j++; k++; } }
简化后
1 2 3 4 5 6 7 8 9 10
voidmergeSort(int *arr1, int len1, int *arr2, int len2, int *temp) { int i = 0, j = 0, k = 0; while (i < len1 && j < len2) temp[k++] = arr1[i] < arr2[j] ? arr1[i++] : arr2[j++]; while (i < len1) temp[k++] = arr1[i++]; while (j < len2) temp[k++] = arr2[j++]; }
voidcountSort(int *arr, int len) { int i, j; int *temp = (int *)malloc(DATA_MAX * sizeof(int)); memset(temp, 0, DATA_MAX * sizeof(int)); // 清零 for (i = 0; i < len; i++) temp[arr[i]]++; for (j = 0, i = 0; j < DATA_MAX; j++) while (temp[j]--) arr[i++] = j; }