亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

內部排序之堆排序的實現詳解

2020-01-26 16:09:18
字體:
來源:轉載
供稿:網友
堆排序(Heap Sort)只需要一個記錄大小的輔助空間,每個待排序的記錄僅占有一個存儲空間。
(1)基本概念
a)堆:設有n個元素的序列:
{k1, k2, ..., kn}
對所有的i=1,2,...,(int)(n/2),當滿足下面關系:
                                                                  ki≤k2i,ki≤k2i+1
                                                  或            ki≥k2i,ki≥k2i+1
這樣的序列稱為堆。
堆的兩種類型:
   根結點最小的堆----小根堆。
   根結點最大的堆----大根堆。
根結點稱為堆頂,即:在一棵完全二叉樹中,所有非葉結點的值均小于(或均大于)左、右孩子的值。
b)堆排序:是一種樹型選擇排序,特點是,在排序過程中,把R[1..n]看成是一個完全二叉樹的存儲結構,利用完全二叉樹雙親結點和孩子結點的內在關系,在當前無序區中選擇關鍵字最大(最?。┑挠涗?。
2)堆排序步驟:
1、從k-1層的最右非葉結點開始,使關鍵字值大(或?。┑挠涗浿鸩较蚨鏄涞纳蠈右苿?,最大(或?。╆P鍵字記錄成為樹的根結點,使其成為堆。
2、逐步輸出根結點,令r[1]=r[i](i=n,,n-1,...,2),在將剩余結點調整成堆。直到輸出所有結點。我們稱這個自堆頂到葉子的調整過程為“篩選”。
(3)要解決的兩個問題:
1、如何由一個無序序列建成一個堆;
2、輸出一個根結點后,如何將剩余元素調整成一個堆。
將一個無序序列建成一個堆是一個反復“篩選”的過程。若將此序列看成是一個完全二叉樹,則最后一個非終端結點是第floor(n/2)個元素,由此“篩選”只需從第floor(n/2)個元素開始。
堆排序中需一個記錄大小的輔助空間,每個待排的記錄僅占有一個存儲空間。堆排序方法當記錄較少時,不值得提倡。當n很大時,效率很高。堆排序是不穩定的。
堆排序的算法和篩選的算法如第二節所示。為使排序結果是非遞減有序排列,我們在排序算法中先建一個“大頂堆”,即先選得一個關鍵字為最大的記錄并與序列中最后一個記錄交換,然后對序列中前n-1個記錄進行篩選,重新將它調整為一個“大頂堆”,然后將選得的一個關鍵字為最大的記錄(也就是第一個元素)與當前最后一個記錄交換(全局看是第n-1個),如此往復,直到排序結束。由到,篩選應按關鍵字較大的孩子結點向下進行。
堆排序的算法描述如下: 

 

用C語言代碼實現如下:
復制代碼 代碼如下:

#include "iostream"
using namespace std;
#define MAXSIZE 20
typedef struct
{
 int key;
 //其他數據信息
}RedType;
typedef struct
{
 RedType r[MAXSIZE+1];
 int length;
}Sqlist;
typedef Sqlist HeapType;  //堆采用順序表存儲表示
void HeapAdjust(HeapType &H,int s,int m)   //已知H.r[s...m]中記錄的關鍵字出H.r[s].key之外均滿足堆的定義,本函數調整H.r[s]的關鍵字,使H.r[s...m]成為一個大頂堆(對其中記錄的關鍵字而言)
{
 int j;
 RedType rc;
 rc=H.r[s];
 for(j=2*s;j<=m;j*=2)   //沿key較大的孩子結點向下篩選
 {
  if(j<m && (H.r[j].key<H.r[j+1].key))     //j為key較大的記錄的下標
   ++j;
  if(rc.key>=H.r[j].key)           //rc應插入在位置s上
   break;
  H.r[s]=H.r[j];      //將左、右孩子較大的結點與父節點進行交換,建成大頂堆
  s=j;
 }
 H.r[s]=rc;             //插入
}
void HeapSort(HeapType &H)      //對順序表H進行堆排序
{
 int i;
 for(i=H.length/2;i>0;--i)   //由一個無序序列建成一個大頂堆,將序列看成是一個完全二叉樹,則最后一個非終端節點是第n/2個元素
  HeapAdjust(H,i,H.length);
 for(i=H.length;i>1;--i)
 {
  H.r[0]=H.r[1];   //將堆頂記錄和當前未經排序的子序列H.r[1...i]中最后一個記錄相互交換
  H.r[1]=H.r[i];
  H.r[i]=H.r[0];
  HeapAdjust(H,1,i-1);    //將H.r[1...i-1]重新調整為大頂堆
 }
}//HeapSort
void InputL(Sqlist &L)
{
 int i;
 printf("Please input the length:");
 scanf("%d",&L.length);
 printf("Please input the data needed to sort:/n");
 for(i=1;i<=L.length;i++)    //從數組的第1個下標開始存儲,第0個下標作為一個用于交換的臨時變量
  scanf("%d",&L.r[i].key);
}
void OutputL(Sqlist &L)
{
 int i;
 printf("The data after sorting is:/n");
 for(i=1;i<=L.length;i++)
  printf("%d ",L.r[i].key);
 printf("/n");
}
int main(void)
{
 Sqlist H;
 InputL(H);
 HeapSort(H);
 OutputL(H);
 system("pause");
 return 0;
}

不使用上面的結構體的另外一種方法如下:
復制代碼 代碼如下:

/*
*堆排序
*/
#include "iostream"
using namespace std;
#define N 10
int array[N];
void man_input(int *array)
{
 int i;
 for(i=1;i<=N;i++)
 {
  printf("array[%d]=",i);
  scanf("%d",&array[i]);
 }
}
void mySwap(int *a,int *b)//交換
{
 int temp;
 temp=*a;
 *a=*b;
 *b=temp;
}
void heap_adjust(int *heap,int root,int len)     //對堆進行調整,使下標從root到len的無序序列成為一個大頂堆
{
 int i=2*root;
 int t=heap[root];
 while(i<=len)
 {
  if(i<len)
  {
   if(heap[i]<heap[i+1])
    i++;
  }
  if(t>=heap[i])
   break;
  heap[i/2]=heap[i];
  i=2*i;
 }
 heap[i/2]=t;
}
void heapSort(int *heap,int len)      //堆排序
{
 int i;
 for(i=len/2;i>0;i--)    //由一個無序序列建成一個大頂堆,將序列看成是一個完全二叉樹,則最后一個非終端節點是第len/2個元素
 {
  heap_adjust(heap,i,len);
 }
 for(i=len;i>=1;i--)
 {
  mySwap(heap+i,heap+1);    //將堆頂記錄與最后一個記錄相互交換
  heap_adjust(heap,1,i-1);   //將下標為1~i-1的記錄重新調整為大頂堆
 }
}
void print_array(int *array,int n)
{
 int k;
 for(k=1;k<n+1;k++)
 {
  printf("%d/t",array[k]);
 }
}
int main(void)
{
 man_input(array);
 heapSort(array,N);
 printf("/nAfter sorted by the heap_sort algorithm:/n");       
 print_array(array,N);   //打印堆排序結果
 system("pause");
 return 0;
}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
1769国内精品视频在线播放| 色一区av在线| 亚洲成人网在线观看| 亚洲精品免费一区二区三区| 欧美激情亚洲视频| 粗暴蹂躏中文一区二区三区| 日韩av综合网| 欧美激情网站在线观看| 欧美激情精品久久久久| 精品国产精品自拍| 性视频1819p久久| 精品国产依人香蕉在线精品| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲国产精品视频在线观看| 成人精品久久av网站| 主播福利视频一区| 国产精品美乳在线观看| 欧美精品videosex极品1| 久久精视频免费在线久久完整在线看| 亚洲黄一区二区| 日韩av在线网站| 亚洲精品久久久久久久久久久久久| 国外成人免费在线播放| 欧美猛交免费看| 日本高清不卡在线| 亚洲精品永久免费| 黑人巨大精品欧美一区免费视频| 热门国产精品亚洲第一区在线| 亚洲精品午夜精品| 青青草原一区二区| 在线电影av不卡网址| 亚洲综合日韩中文字幕v在线| 亚洲一区亚洲二区亚洲三区| 精品无人区乱码1区2区3区在线| 亚洲福利小视频| 91夜夜未满十八勿入爽爽影院| 欧美xxxx14xxxxx性爽| 久久99亚洲精品| 欧美精品午夜视频| 国产精品视频在线播放| 久久久免费电影| 久久久久一本一区二区青青蜜月| 亚洲在线视频观看| 久久的精品视频| 久久人人97超碰精品888| 国产91精品高潮白浆喷水| 成人国产在线视频| 国产亚洲精品一区二555| 欧美在线视频一区二区| 91免费精品视频| 在线观看欧美日韩国产| 亚洲精品一区二三区不卡| 91国产精品视频在线| 91精品国产色综合久久不卡98| 日韩精品高清在线观看| 国产91在线播放九色快色| 精品在线欧美视频| 亚洲免费伊人电影在线观看av| 日本一欧美一欧美一亚洲视频| 久久免费国产精品1| 亚洲韩国欧洲国产日产av| 欧美日韩精品在线观看| 91精品啪aⅴ在线观看国产| 欧美一级大片在线免费观看| 精品视频久久久久久| 久久久极品av| 亚洲第一区在线观看| 亚洲精品不卡在线| 亚洲福利影片在线| 国产成人+综合亚洲+天堂| 精品少妇一区二区30p| 亚洲欧洲免费视频| 日韩国产精品视频| 日本久久久久久久久| 精品久久久久久久久国产字幕| 日韩激情av在线播放| www.亚洲一区| 97香蕉久久超级碰碰高清版| 91麻豆桃色免费看| 日韩电视剧在线观看免费网站| 国产精品福利网| 久久人91精品久久久久久不卡| 欧美日韩国产成人| 欧美国产在线视频| 8090成年在线看片午夜| 国产精品1区2区在线观看| 孩xxxx性bbbb欧美| 亚洲一区二区三| 亚洲综合中文字幕68页| 精品高清一区二区三区| 国产精品一区二区三区久久| 亚洲iv一区二区三区| 精品久久国产精品| 久久久www成人免费精品张筱雨| 日韩高清av一区二区三区| 97在线精品国自产拍中文| 亚洲第一免费播放区| 亚洲人成在线播放| 久久香蕉国产线看观看网| 国产日韩欧美中文在线播放| 欧美精品激情在线| 国产精品嫩草视频| 91精品中文在线| 久久躁日日躁aaaaxxxx| 欧美亚州一区二区三区| 91成人精品网站| 欧美一二三视频| 亚洲美女又黄又爽在线观看| 亚洲乱码国产乱码精品精| 亚洲欧美三级在线| 久久久成人精品| 久久精品国产成人精品| 日韩精品极品在线观看播放免费视频| 亚洲视频免费一区| 日韩人在线观看| 成人性生交大片免费观看嘿嘿视频| 国产精品入口夜色视频大尺度| 色综合久久久888| 日韩av免费网站| 精品久久久久久久久久ntr影视| 国产欧美精品一区二区三区-老狼| 亚洲精品福利资源站| 国产深夜精品福利| 国产精品免费一区豆花| 亚洲乱亚洲乱妇无码| 欧美午夜精品久久久久久浪潮| 国产精品男女猛烈高潮激情| 亚洲精品一区av在线播放| 亚洲一区二区三区xxx视频| 国产精品一区二区久久精品| 国产欧美韩国高清| 亚洲精品综合精品自拍| 欧美日韩免费在线| 欧美午夜www高清视频| 91精品国产91久久久久久| 亚洲视频日韩精品| 亚洲成人性视频| 一区二区三区天堂av| 成人久久久久久久| 国产精品第七十二页| 精品无人区乱码1区2区3区在线| 夜夜躁日日躁狠狠久久88av| 亚洲欧洲免费视频| 精品国产一区二区三区久久久狼| 国产suv精品一区二区| 亚洲精品www久久久久久广东| 色樱桃影院亚洲精品影院| 亚洲va久久久噜噜噜久久天堂| www.欧美三级电影.com| 国内精品久久久久久| 欧美精品免费看| 国产精品普通话| 777午夜精品福利在线观看| 国产精品永久免费在线| 欧美成aaa人片在线观看蜜臀| 国产999精品久久久影片官网| 成人女保姆的销魂服务| 亚洲视频电影图片偷拍一区| 国产欧美亚洲精品| 久久久久久久久久久免费| 久久久亚洲福利精品午夜| 国产亚洲欧美视频| 国内精品400部情侣激情| 亚洲欧美综合区自拍另类|