就是我排序的時候發現總有兩個數的位置有問題,如圖

這是實作的代碼
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//調整(重建)大根堆,如果要從大到小則需要建立小根堆
void BigHeap_Adjust(int input[],int m,int s)//input[s]為根結點,m 是總的結點數,這個是大根堆的調整
{
int temp = input[s];//保存結點資料
for (int j = 2 * s; j <= m; j *= 2)//對于第 s 個結點,篩選一直到葉子結點結束
{
if (((j + 1) < m) && (input[j] < input[j + 1])) j++;//找到值最大的孩子結點 j
if (temp >= input[j]) break;//如果當前結點比最大的孩子結點的值還大,直接略過
input[s] = input[j];//如果當前結點的值比孩子結點中最大的值小,則將最大的值移至該結點
s = j;
}
input[s] = temp;//最終將temp的值放到正確的位置
}
void SmallHeap_Adjust(int input[], int m, int s)
{
int temp = input[s];
for (int j = 2 * s; j <= m; j *= 2)
{
if (((j + 1) < m) && (input[j] > input[j + 1])) j++;//找到值最小的孩子結點 j
if (temp <= input[j]) break;//如果當前結點比最小的孩子結點的值還小,直接略過
input[s] = input[j];//如果當前結點的值比孩子結點中最小的值大,則將最大的值移至該結點
s = j;
}
input[s] = temp;//最終將temp的值放到正確的位置
}
void BigHeap_Sort(int *input, int length)
{
int i, temp,n=length;
//新建堆
for (int i = length / 2; i >= 1; i--) //自第 length/2 個記錄開始進行篩選建堆
BigHeap_Adjust(input, length, i);
for (i = n; i >=1; i--)
{
temp = input[1]; //將堆頂記錄和堆中的最后一個記錄互換,即取出堆頂
input[1] = input[i];
input[i] = temp;
if(i!=1) BigHeap_Adjust(input,i - 1,1); //進行調整,使剩下的部分變成堆
}
}
void SmallHeap_Sort(int *input, int length)
{
int i, temp, n = length;
//新建堆
for (int i = length / 2; i >= 1; i--) //自第 length/2 個記錄開始進行篩選建堆
SmallHeap_Adjust(input, length, i);
for (i = n; i >= 1; i--)
{
temp = input[1]; //將堆頂記錄和堆中的最后一個記錄互換,即取出堆頂
input[1] = input[i];
input[i] = temp;
if (i!=1) SmallHeap_Adjust(input, i - 1, 1); //進行調整,使剩下的部分變成堆
}
}
int main()
{
int a, b, *p;
char i;
srand((unsigned)time(NULL));
printf("(Heap Sort)\n請輸入要排序的數的個數\n");
scanf("%d", &a);
p = (int *)malloc((a+1) * sizeof(int));
if (p != NULL) printf("Memory allocation successful!\n");
for (i = 1; i <= a; i++)
{
b = (rand() % 1001);
printf("請輸入第%d個數:%d\n", i, b);
p[i] = b;
}
printf("輸入結果如下:\n");
for (i = 1; i < a+1; i++)
printf("%d\t", p[i]);
BigHeap_Sort(p,a);
printf("\n從小到大排序結果如下:\n");
for (i = 1; i < a+1; i++)
printf("%d\t", p[i]);
SmallHeap_Sort(p, a);
printf("\n從大到小排序結果如下:\n");
for (i = 1; i < a + 1; i++)
printf("%d\t", p[i]);
printf("\n");
system("pause");
return 0;
}
uj5u.com熱心網友回復:
//調整(重建)大根堆void BigHeap_Adjust 這里的函式是錯誤的。同樣地 SmallHeap_Adjust 也是錯誤的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/24076.html
標籤:C語言
上一篇:求大佬幫忙
下一篇:咨詢C++ 資料批量處理問題
