最大堆排序A[0]爲第一個元素

#include  
#include <iostream>
#include <sstream>
#include <string>
#include <cmath>
#include <time.h>
#include <iomanip>
using namespace std;
/*
注意:發現有問題要馬上糾正,否則往後看就會忘記了。
*/
// 維護堆的性質
void heapAdjust(int* p, int size, int i)
{        //本段代碼,先取出父子之間最大的數的下標,
//從[0]開始取而非[1]
//然後判斷該下標是不是父親的下標,若是,
int left = 2 * i + 1;//左子下標 //說明父親最大,不是,說明子最大,子最大
int right = 2 * i + 2;//右子下標 //就要交換,同時
int lagest = i;  //臨時變量,保存最大下標

if (i <= (size - 1) / 2)  //*size - 1容易錯誤的地方,如果i是葉子的下標,就不用交換,因爲他沒有子樹
{
// 24-36把父子之間最大值得下標找出來
if ((left < size) && (p[left] > p[i])) // left < size 注意 < 不取等號,因爲size是數組大小
lagest = left;  //父與左子比較大小
if ((right < size) && (p[right] > p[lagest]))  //***********一直的錯誤所在
lagest = right;   //**************************

if (lagest != i) // 父子之間交換值,使父親的值最大
{
swap(p[i], p[lagest]);
heapAdjust(p, size, lagest); // 交換後要使子樹滿足最大堆的性質
}
}
}


// 創建最大堆
void buildHeap(int *p, int size)
{

for (int i = (size - 1) / 2; i >= 0; i--) // 從最後一個葉子的父親開始遞減,i 可以取到 0
{ // 調整每個子樹的大小性質
heapAdjust(p, size, i);
}
}


// 排序堆,升序
void heapSort(int *p, int size)
{
buildHeap(p, size);
for (int i = size - 1; i > 0; i--) //* i 要不能取等號 =,i要降到1
{        //* 將剩下的i-1個數重新調整爲最大堆,
// 也可以利用buildHeap()重新創建 ,
swap(p[0], p[i]);        // 但是由於只有第一和最後一個交換,最大的放最後
heapAdjust(p, i , 0); //*********這裏應該是i而不是i-1    // 並不影響其他數據,直接將根節點
// 重新調整一下就行了
}
}


inline void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}


int main()
{

//****************************************
clock_t start, finish;
double totalTime;
start = clock();
//**************主程序插入下***************
int A[10] = { 1, 3, 2, 5, 7, 3, 8, 9, 23, 12 };
int B[10];
//int C[1000000];
for (int i = 0; i < 10; i++)
{
B[i] = A[i];
cout << A[i] << " ";
}
cout << endl;

buildHeap(B, 10);
for (int i = 0; i < 10; i++)
{
cout << B[i] << " ";
}
cout << endl;

heapSort(B, 10);
for (int i = 0; i < 10; i++)
{
cout << B[i] << " ";
}

//**************主程序插入上***************
finish = clock();
totalTime = (double)(finish - start) * 1000 / (double)CLOCKS_PER_SEC;
for (int i = 0; i < 2; i++)
{
cout << endl;
}
cout << "此程序的運行時間爲:" << totalTime << "毫秒!" << endl;
for (int i = 0; i < 10; i++)
{
cout << endl;
}
system("pause");
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章