3 回答

TA貢獻1859條經驗 獲得超6個贊
【概念】堆排序(Heapsort)是指利用堆積樹(堆)這種數據結構所設計的一種排序算法,它是選擇排序的一種??梢岳脭到M的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大于其父節點的值,即A[PARENT[i]]>=A[i]。在數組的非降序排序中,需要使用的就是大根堆,因為根據大根堆的要求可知,最大的值一定在堆頂?!酒鹪础?991年的計算機先驅獎獲得者、斯坦福大學計算機科學系教授羅伯特·弗洛伊德(RobertW.Floyd)和威廉姆斯(J.Williams)在1964年共同發明了著名的堆排序算法(HeapSort)?!竞喗椤慷雅判蚶昧舜蟾眩ɑ蛐「眩┒秧斢涗浀年P鍵字最大(或最小)這一特征,使得在當前無序區中選取最大(或最?。╆P鍵字的記錄變得簡單。(1)用大根堆排序的基本思想①先將初始文件R[1..n]建成一個大根堆,此堆為初始的無序區②再將關鍵字最大的記錄R[1](即堆頂)和無序區的最后一個記錄R[n]交換,由此得到新的無序區R[1..n-1]和有序區R[n],且滿足R[1..n-1].keys≤R[n].key③由于交換后新的根R[1]可能違反堆性質,故應將當前無序區R[1..n-1]調整為堆。然后再次將R[1..n-1]中關鍵字最大的記錄R[1]和該區間的最后一個記錄R[n-1]交換,由此得到新的無序區R[1..n-2]和有序區R[n-1..n],且仍滿足關系R[1..n-2].keys≤R[n-1..n].keys,同樣要將R[1..n-2]調整為堆?!钡綗o序區只有一個元素為止。(2)大根堆排序算法的基本操作:①建堆,建堆是不斷調整堆的過程,從len/2處開始調整,一直到第一個節點,此處len是堆中元素的個數。建堆的過程是線性的過程,從len/2到0處一直調用調整堆的過程,相當于o(h1)+o(h2)…+o(hlen/2)其中h表示節點的深度,len/2表示節點的個數,這是一個求和的過程,結果是線性的O(n)。②調整堆:調整堆在構建堆的過程中會用到,而且在堆排序過程中也會用到。利用的思想是比較節點i和它的孩子節點left(i),right(i),選出三者最大(或者最小)者,如果最大(小)值不是節點i而是它的一個孩子節點,那邊交互節點i和該節點,然后再調用調整堆過程,這是一個遞歸的過程。調整堆的過程時間復雜度與堆的深度有關系,是lgn的操作,因為是沿著深度方向進行調整的。③堆排序:堆排序是利用上面的兩個過程來進行的。首先是根據元素構建堆。然后將堆的根節點取出(一般是與最后一個節點進行交換),將前面len-1個節點繼續進行堆調整的過程,然后再將根節點取出,這樣一直到所有節點都取出。堆排序過程的時間復雜度是O(nlgn)。因為建堆的時間復雜度是O(n)(調用一次);調整堆的時間復雜度是lgn,調用了n-1次,所以堆排序的時間復雜度是O(nlgn)[2]注意:①只需做n-1趟排序,選出較大的n-1個關鍵字即可以使得文件遞增有序。②用小根堆排序與利用大根堆類似,只不過其排序結果是遞減有序的。堆排序和直接選擇排序相反:在任何時刻堆排序中無序區總是在有序區之前,且有序區是在原向量的尾部由后往前逐步擴大至整個向量為止【特點】堆排序(HeapSort)是一樹形選擇排序。堆排序的特點是:在排序過程中,將R[l..n]看成是一棵完全二叉樹的順序存儲結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關系(參見二叉樹的順序存儲結構),在當前無序區中選擇關鍵字最大(或最小)的記錄【算法分析】堆排序的時間,主要由建立初始堆和反復重建堆這兩部分的時間開銷構成,它們均是通過調用Heapify實現的。平均性能:O(N*logN)。其他性能:由于建初始堆所需的比較次數較多,所以堆排序不適宜于記錄數較少的文件。堆排序是就地排序,輔助空間為O(1)。它是不穩定的排序方法。(排序的穩定性是指如果在排序的序列中,存在前后相同的兩個元素的話,排序前和排序后他們的相對位置不發生變化)。

TA貢獻1789條經驗 獲得超10個贊
-x language filename
設定文檔所使用的語言,使后綴名無效,對以后的多個有效.也就是根據約定C語言的后綴名稱是.c的,而C++的后綴名是.C或.cpp,假如您很個性,決定您的C代碼文檔的后綴名是.pig 哈哈,那您就要用這個參數,這個參數對他后面的文檔名都起作用,除非到了下一個參數的使用。
能夠使用的參數嗎有下面的這些
`c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `assembler-with-cpp'.
看到英文,應該能夠理解的。
例子用法:
gcc -x c hello.pig
添加回答
舉報