voidSelectSort(intarray[], int size){ for (int i = 0; i < size; i++) { // 无序 [0, size - 1 - i] // 有序 [size - i, size - 1] int maxIdx = 0; // 要查找整个无序区间的最大值的下标 for (int j = 1; j <= size - 1 - i; j++) { if (array[j] >= array[maxIdx]) { maxIdx = j; } } // maxIdx 记录着无序区间部分最大的数的下标 // 和无序区间的最后一个位置的数进行交换 swap(array[maxIdx], array[size - 1 - i]); } }
voidSelectSortOP(intarray[], int size){ int begin = 0; int end = size - 1; // 有序 [0, begin - 1] 最小的数 // 有序 [end + 1, size - 1] 最大的数 // 无序 [begin, end] while (begin <= end) { int min = begin; int max = begin; for (int i = begin; i <= end; i++) { if (array[i] > array[max]) { max = i; } if (array[i] < array[min]) { min = i; } } // 最小的数放到无序区间的最开始 // 最大的数放到无序区间的最末尾 swap(array[min], array[begin]); if (max == begin) { max = min; } swap(array[max], array[end]); begin++; end--; } }
voidHeapify(intarray[], int size, int index){ int left = 2 * index + 1; int right = 2 * index + 2; if (left >= size) { return; } int max = left; if (right < size && array[right] > array[left]) { max = right; } if (array[index] >= array[max]) { return; } swap(array[max], array[index]); Heapify(array, size, max); }
voidCreateHeap(intarray[], int size){ // 从最后一个非叶子结点,一直到 0,不断的向下调整 for (int i = (size - 2) / 2; i >= 0; i--) { Heapify(array, size, i); } }
voidHeapSort(intarray[], int size){ // 建大堆 CreateHeap(array, size); // n // 无序 [0, size - 1 - i] // 有序 [size - i, size - 1] for (int i = 0; i < size; i++) { // n * log n // 交换最大的数和无序区间的最后一个数 swap(array[0], array[size - 1 - i]); // 堆的性质被破坏了,要调整的是剩余无序部分的长度 size - 1 - i Heapify(array, size - 1 - i, 0); // log n } }