1. 直接选择排序
//选择排序(每次把未排序的子序列中的最小记录与arr[i]替换)
void SERECTsort(int* arr, int len) {
for (int i = 0; i < len - 1; i++) {
int min = i;
for (int j = i + 1; j < len; j++) //第pass趟排序后,前pass个序列有序且最小
if (arr[min] > arr[j])
min = j;
swap(arr[i], arr[min]);
// display(arr, len); //第pass趟的结果
}
}
2. 堆排序
//堆排序(1.构造小顶堆,取出根节点,将最后一个叶子节点替换到根节点,重新调整小顶堆,取出根节点...)
//根据二叉堆节点的序号特性,构造小顶堆(线性表)
void buildMinHeap(int* arr, int len) {
//构造小顶堆
for (int i = len / 2 ; i >= 1; i--) {
int j = i;
//保证调整后的小顶堆性质
while (2 * j <= len) {
j = 2 * j;
//若存在右孩子,先找左右孩子的最小
if ((j + 1) <= len)
if (arr[j] < arr[j - 1])
j = j + 1;
//调整
if (arr[j - 1] < arr[j / 2 - 1])
swap(arr[j - 1] , arr[j / 2 - 1]);
display(arr, len);
}
std::cout << "\n";
}
}
//取出根结点,将最后一个叶子结点替换到根结点,调整小顶堆
void deleteRoot(int* arr, int len, int k) {
display(arr, len);
int j = 1;
swap(arr[0],arr[len - k]);
//保证调整后的小顶堆性质
while (2 * j <= len - k) {
j = 2 * j;
//若存在右孩子,先找左右孩子的最小
if (j + 1 <= len - k)
if (arr[j] < arr[j - 1])
j = j + 1;
//调整
if (arr[j - 1] < arr[(j / 2) - 1])
swap(arr[j - 1] , arr[(j / 2) - 1]);
display(arr, len);
}
std::cout << "\n";
}
void Heapsort(int* arr, int len) {
buildMinHeap(arr, len);
for (int k = 1; k <= len; k++) {
deleteRoot(arr,len,k);
}
display(arr,len);
}