當前位置:首頁 » 存儲配置 » 堆排序存儲關鍵字的數據結構

堆排序存儲關鍵字的數據結構

發布時間: 2024-03-27 15:40:04

① 數據結構的堆排序

堆排序(C語言版)2010-03-15 23:24/*簡述:

所謂堆排序,就是就是將所要排序的數以二叉樹的形式存儲。其中,有根的元素值大於其孩子結點。一直遞歸下去,每當取出最大的元素,考量其左右子樹,以保持其根節點最大的性質不變。這個演算法的時間復雜性是O(n log2 n)。證明略。 */

#include<stdio.h>
#define max_size 10//數組元素個數
#include<stdlib.h>
int heap_size;//當前堆中的元素數目
void MAX_HEAPFY(int A[], int i) {
int left, right, temp, largest;
left = 2*i;//
right = 2*i + 1;
if( left <= heap_size && A[i] < A[left] )
largest = left;
else largest = i;
if( right <= heap_size && A[right] > A[largest])
largest = right;
if(largest != i) {
temp = A[i];
A[i] = A[largest];
A[largest] = temp;
MAX_HEAPFY(A, largest);
}
}
void BUILD_MAX_HEAP(int A[]) {
//這個函數是用來產生最大堆的
int i;
heap_size = max_size-1;
for( i = (max_size-1)/2; i != 0; i--) {
MAX_HEAPFY(A, i);
printf("*****\n");
}
}
void HEAP_SORT(int A[]) {
int i, temp;
BUILD_MAX_HEAP(A);
for( i = (max_size-1); i != 1; i--) {
temp = A[1];
A[1] = A[i];
A[i] = temp;
--heap_size;
MAX_HEAPFY(A, 1);
}
}
int main()
{
int i;
int A[max_size];
for(i = 1; i != max_size; i++) {
A[i] = rand() % max_size;
printf("%5d", A[i]);
}
HEAP_SORT( A );
printf("\n\n");
for(i = 1; i != max_size; i++)
printf("%5d",A[i]);
system("PAUSE");
}

② C語言堆排序法誰能通俗易懂又清晰地講解一下謝謝

您可以找本數據結構的書看看,比如清華嚴尉敏的《數據結構》
以下摘抄於 http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.4.2.1.htm 這個網站的講解挺不錯,您可以看看
1、 堆排序定義
n個關鍵字序列Kl,K2,…,Kn稱為堆,當且僅當該序列滿足如下性質(簡稱為堆性質):
(1) ki≤K2i且ki≤K2i+1 或(2)Ki≥K2i且ki≥K2i+1(1≤i≤ )

若將此序列所存儲的向量R[1..n]看做是一棵完全二叉樹的存儲結構,則堆實質上是滿足如下性質的完全二叉樹:樹中任一非葉結點的關鍵字均不大於(或不小於)其左右孩子(若存在)結點的關鍵字。

3、堆排序特點
堆排序(HeapSort)是一樹形選擇排序。
堆排序的特點是:在排序過程中,將R[l..n]看成是一棵完全二叉樹的順序存儲結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關系【參見二叉樹的順序存儲結構】,在當前無序區中選擇關鍵字最大(或最小)的記錄。

5、堆排序
堆排序利用了大根堆(或小根堆)堆頂記錄的關鍵字最大(或最小)這一特徵,使得在當前無序區中選取最大(或最小)關鍵字的記錄變得簡單。

(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]調整為堆。
……
直到無序區只有一個元素為止。

(2)大根堆排序演算法的基本操作:
① 初始化操作:將R[1..n]構造為初始堆;
② 每一趟排序的基本操作:將當前無序區的堆頂記錄R[1]和該區間的最後一個記錄交換,然後將新的無序區調整為堆(亦稱重建堆)。
注意:
①只需做n-1趟排序,選出較大的n-1個關鍵字即可以使得文件遞增有序。
②用小根堆排序與利用大根堆類似,只不過其排序結果是遞減有序的。堆排序和直接選擇排序相反:在任何時刻,堆排序中無序區總是在有序區之前,且有序區是在原向量的尾部由後往前逐步擴大至整個向量為止。

(3)堆排序的演算法:
void HeapSort(SeqIAst R)
{ //對R[1..n]進行堆排序,不妨用R[0]做暫存單元
int i;
BuildHeap(R); //將R[1-n]建成初始堆
for(i=n;i>1;i--){ //對當前無序區R[1..i]進行堆排序,共做n-1趟。
R[0]=R[1];R[1]=R[i];R[i]=R[0]; //將堆頂和堆中最後一個記錄交換
Heapify(R,1,i-1); //將R[1..i-1]重新調整為堆,僅有R[1]可能違反堆性質
} //endfor
} //HeapSort

③ 堆排序是什麼

堆排序(HeapSort)是一樹形選擇排序。堆排序的特點是:在排序過程中,將R[l..n]看成是一棵完全二叉樹的順序存儲結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關系(參見二叉樹的順序存儲結構),在當前無序區中選擇關鍵字最大(或最小)的記錄
其過程為:
(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]調整為堆。

……

直到無序區只有一個元素為止。

(2)大根堆排序演算法的基本操作:

① 初始化操作:將R[1..n]構造為初始堆;


每一趟排序的基本操作:將當前無序區的堆頂記錄R[1]和該區間的最後一個記錄交換,然後將新的無序區調整為堆(亦稱重建堆)。

注意:

①只需做n-1趟排序,選出較大的n-1個關鍵字即可以使得文件遞增有序。

②用小根堆排序與利用大根堆類似,只不過其排序結果是遞減有序的。堆排序和直接選擇排序相反:在任何時刻堆排序中無序區總是在有序區之前,且有序區是在原向量的尾部由後往前逐步擴大至整個向量為止

④ 數據結構:堆排序的演算法實現

修改到如下形式即可
#include <stdio.h>
#include <iostream.h>
#define max 10

void headadjust(int num[],int head,int l)
{
//head為頂點的下標
for(int i = 2 * head;i < l;i *= 2)
{
if(head < l && num[i] < num[i+1])
++i;

if(num[head] > num[i])
break;

int flag = num[head];
num[head] = num[i];
num[i] = flag;
head = i;
}
}

void headsort(int num[])
{
for(int i = max/2; i >= 1; --i)
{
headadjust(num,i,max);
}

for(int j = max;j > 1; --j)
{
int temp=num[j];
num[j] = num[1];
num[1] = temp;
headadjust(num,1,j - 1);
}
}

void main()
{
int num[max+1]={0,39,45,12,89,45,67,38,45,72,88};
cout<<"排序前:";
for(int i = 1;i <= max;i++)
{
cout<<num[i]<<" ";
}
cout<<endl;
headsort(num);
cout<<"排序後:";
for(int j=1;j<=max;j++)
{
cout<<num[j]<<" ";
}
cout<<endl;
}

熱點內容
手機報停恢復需要的是什麼密碼 發布:2024-11-27 20:37:02 瀏覽:592
域名訪問量查詢 發布:2024-11-27 20:22:13 瀏覽:725
如何清理網頁帳號和登錄密碼 發布:2024-11-27 20:18:53 瀏覽:372
大發明解壓密碼 發布:2024-11-27 20:18:52 瀏覽:502
藍鷗c語言 發布:2024-11-27 20:14:38 瀏覽:813
阿里雲高配伺服器租用 發布:2024-11-27 20:13:40 瀏覽:758
國外圖片上傳 發布:2024-11-27 20:13:31 瀏覽:546
蘋果手機怎麼重置密碼 發布:2024-11-27 20:10:28 瀏覽:533
萬里紅存儲介質信息消除工具 發布:2024-11-27 20:10:13 瀏覽:387
氫怎麼存儲 發布:2024-11-27 20:08:46 瀏覽:837