voidShellSort(intarray[], int len, int dlta[], int dLen) { //dlta 0~dLen-1 array 1~len for (int k = 0; k < dLen; ++k) { ShellInsert(array, len, dlta[k]); } }
voidShellInsert(intarray[], int len, int d) { //不对子表单独处理,而是一起处理 for (int i = d + 1; i <= len; ++i) { if (array[i] < array[i - d]) { array[0] = array[i - d]; int j = i - d; for (; j > 0 && array[j] < array[0]; j -= d) //这个大于0很重要,因为[0]已经不是哨兵了 { array[j + d] = array[j]; } array[j + d] = array[0]; } } }
voidSelcetSort(intarray[], int len) { for (int i = 1; i < len; ++i) { int min = i; for (int j = i + 1; j <= len; ++j) { if (array[min] > array[j]) { min = j; } } if (min != i) { Swap(array + i, array + min); } } }
堆排序
大根堆定义: $ai \ge a{2i}\quad and\quad ai \ge a{2i+1}$ 小根堆
voidHeapSort(intarray[], int len) { voidHeadAdjust(intarray[], int len, int k); for (int i = len / 2; i > 0; --i) { HeadAdjust(array, len, i); } for (int i = 1; i < len; ++i) { Swap(array, array + len - i + 1); HeadAdjust(array, len - i, 1); } }
voidHeadAdjust(intarray[], int len, int k) { int son = 2 * k; while (son <= len) { if (son + 1 <= len && array[son] < array[son + 1]) ++son; if (array[son] < array[k]) return; Swap(array + son, array + k); k = son; son = 2 * k; } }