代码如下:
- //1.先将数组里的数字调整为大根堆(父节点均大于两个子节点)--由第一个非叶子节点开始
- //第一个叶子节点是len/2,所以非叶子节点位len/2-1
- //2.将根节点和最后一个结点进行交换,再将剩下的节点调整为大根堆,依此类推,直到将数组中的数字从小到大排好序
-
- void HeapAdjust(int* nums, int start, int end)//调整为大根堆
- {
- int temp = nums[start];//第一个非叶子节点作为start
- for (int i = 2 * start + 1; i <= end; i = i * 2 + 1)//由它的左节点开始
- {
- if (i < end && nums[i] < nums[i + 1])//如果它的左节点<右节点,则此时右节点的下标为i
- {
- i++;
- }
- if (nums[i] > temp)//左右节点中最大的数>父节点,就将两个交换
- {
- nums[start] = nums[i];//将子节点给父节点
- start = i;
- }
- else
- {
- break;
- }
- }
- nums[start] = temp;//将原来的父节点给子节点
-
- }
-
- void HeapSort(int* nums, int len)//将调整好的大根堆按由小到大的顺序进行排序
- {
- //第一次建立大根堆,从后往前依次调整
- for (int i = (len - 1 - 1) / 2; i >= 0; i--)//从第一个非叶子节点开始
- {
- HeapAdjust(nums , i, len - 1);
- }
- int temp;
- for (int i = 0; i < len - 1; i++)//调整好大根堆之后根节点是最大的
- {
- temp = nums[0];//将根节点和最后一个节点的值进行交换
- nums[0] = nums[len - 1 - i];
- nums[len - 1 - i] = temp;
- HeapAdjust(nums, 0, len - 1 - i - 1);//将剩下的节点再次调整为大根堆
- }
- }
-
-
- int main()
- {
- int n, nums[200];
- cout << "输入元素的个数" << endl;
- cin >> n;
- cout << "依次输入数字" << endl;
- for (int i = 0; i < n; i++)
- {
- cin >> nums[i];
- }
- HeapSort(nums, n);
- cout << "堆排序后的结果" << endl;
- for (int i = 0; i < n; i++)
- {
- cout << nums[i] << " ";
- }
- cout << endl;
-
- }
-