1. 程式人生 > >【C/C++】【資料結構】八大排序

【C/C++】【資料結構】八大排序

複製程式碼
//array是待調整的堆陣列,i是待調整的陣列元素的位置,nlength是陣列的長度
//本函式功能是:根據陣列array構建大根堆
void HeapAdjust(int array[],int i,int nLength)
{
    int nChild;
    int nTemp;
    for(; 2 * i + 1 < nLength;i = nChild)
    {
        //子結點的位置=2*(父結點位置)+1
        nChild = 2 * i + 1;
        //得到子結點中較大的結點
        if(nChild < nLength - 1 
&& array[nChild + 1] > array[nChild]) ++nChild; //如果較大的子結點大於父結點那麼把較大的子結點往上移動,替換它的父結點 if(array[i] < array[nChild]) { nTemp = array[i]; array[i] = array[nChild]; array[nChild] = nTemp; } else break; //否則退出迴圈 } }
//堆排序演算法 void HeapSort(int array[],int length) { int i; //調整序列的前半部分元素,調整完之後第一個元素是序列的最大的元素 //length/2-1是最後一個非葉節點,此處"/"為整除 for(i = length / 2 - 1;i >= 0;--i) HeapAdjust(array,i,length); //從最後一個元素開始對序列進行調整,不斷的縮小調整的範圍直到第一個元素 for(i = length - 1;i > 0;--i) { //把第一個元素和當前的最後一個元素交換,
//保證當前的最後一個位置的元素都是在現在的這個序列之中最大的 array[i] = array[0] ^ array[i]; array[0] = array[0] ^ array[i]; array[i] = array[0] ^ array[i]; //不斷縮小調整heap的範圍,每一次調整完畢保證第一個元素是當前序列的最大值 HeapAdjust(array,0,i); } } int main() { int i; int num[]={9,8,7,6,5,4,3,2,1,0}; HeapSort(num,sizeof(num)/sizeof(int)); for(i = 0;i < sizeof(num) / sizeof(int);i++) { printf("%d ",num[i]); } printf("\nok\n"); return 0; }
複製程式碼