欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言數(shù)據(jù)結(jié)構之堆排序源代碼

 更新時間:2022年04月19日 09:33:39   作者:kuweicai  
這篇文章主要為大家詳細介紹了C語言數(shù)據(jù)結(jié)構之堆排序源代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了C語言堆排序源代碼,供大家參考,具體內(nèi)容如下

1. 堆排序

堆排序的定義及思想可以參考百度百科:

用一句概括,堆排序就是一種改進的選擇排序,改進的地方在于,每次做選擇的時候,不單單把最大的數(shù)字選擇出來,而且把排序過程中的一些操作進行了記錄,這樣在后續(xù)排序中可以利用,并且有分組的思想在里面,從而提高了排序效率,其效率為O(n*logn).

2. 源代碼

堆排序中有兩個核心的操作,一個是創(chuàng)建大頂堆(或者小頂堆,這里用的是大頂堆),再一個就是對堆進行調(diào)整。這里需要注意的是,并沒有真正的創(chuàng)建堆,只是利用完全二叉樹的特性,將其對應到數(shù)組的下標中(例如對于節(jié)點i,如果其存在左孩子和右孩子,那么其下標一定是2*i, 和2*i+1)其中創(chuàng)建的時候是從下向上創(chuàng)建,而調(diào)整則是從上向下調(diào)整。

這里為了方便,堆從a[1]位置開始。

代碼運行結(jié)果如下:

源代碼如下:

#include<stdio.h> 
 
int c=0; 
 
/*heapadjust()函數(shù)的功能是實現(xiàn)從a[m]到a[n]的數(shù)據(jù)進行調(diào)整,使其滿足大頂堆的特性*/ 
/*a[]是待處理的數(shù)組,m是起始坐標, n是終止坐標*/ 
void heapadjust(int a[], int m, int n) 
{ 
  int i, temp; 
  temp=a[m]; 
 
  for(i=2*m;i<=n;i*=2)//從m的左孩子開始 
  { 
    if(i+1<=n && a[i]<a[i+1])//如果左孩子小于右孩子,則將i++,這樣i的值就是最大孩子的下標值 
    { 
      i++; 
    } 
 
    if(a[i]<temp)//如果最大的孩子小于temp,則不做任何操作,退出循環(huán);否則交換a[m]和a[i]的值,將最大值放到a[i]處 
    { 
      break; 
    } 
    a[m]=a[i]; 
    m=i; 
  } 
  a[m]=temp; 
} 
 
void crtheap(int a[], int n)//初始化創(chuàng)建一個大頂堆 
{ 
  int i; 
  for(i=n/2; i>0; i--)//n/2為最后一個雙親節(jié)點,依次向前建立大頂堆 
  { 
    heapadjust(a, i, n); 
  } 
} 
 
/*swap()函數(shù)的作用是將a[i]和a[j]互換*/ 
void swap(int a[], int i, int j) 
{ 
  int temp; 
  temp=a[i]; 
  a[i]=a[j]; 
  a[j]=temp; 
  c++; 
} 
 
void heapsort(int a[], int n) 
{ 
  int i; 
 
  crtheap(a, n); 
  for(i=n; i>1; i--) 
  { 
    swap(a, 1, i);//將第一個數(shù),也就是從a[1]到a[i]中的最大的數(shù),放到a[i]的位置 
    heapadjust(a, 1, i-1);//對剩下的a[1]到a[i],再次進行堆排序,選出最大的值,放到a[1]的位置 
  } 
} 
 
int main(void) 
{ 
  int i; 
  int a[10]={-1,5,2,6,0,3,9,1,7,4}; 
  printf("排序前:"); 
  for(i=1;i<10;i++) 
  { 
    printf("%d",a[i]); 
  } 
  heapsort(a, 9); 
  printf("\n\n共交換數(shù)據(jù)%d次\n\n", c); 
  printf("排序后:"); 
  for(i=1;i<10;i++) 
  { 
    printf("%d",a[i]); 
  } 
  printf("\n\n\n"); 
  return 0; 
} 

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java?C++題解leetcode1598文件夾操作日志搜集器

    Java?C++題解leetcode1598文件夾操作日志搜集器

    這篇文章主要為大家介紹了Java?C++題解leetcode1598文件夾操作日志搜集器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Qt中樹形控件Tree Widget的使用方法匯總

    Qt中樹形控件Tree Widget的使用方法匯總

    最近小編在研究Tree Widget樹形控件的相關知識,這種控件其實有時還是很有用處的,我主要利用的是帶有復選框的樹形控件,下面通過實例代碼給大家介紹下Qt中樹形控件Tree Widget的一些使用方法,感興趣的朋友一起學習吧
    2021-11-11
  • Qt在線安裝加速的實現(xiàn)

    Qt在線安裝加速的實現(xiàn)

    本文主要介紹了Qt在線安裝加速的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • MFC Frame-Splitter模型實例原理解析

    MFC Frame-Splitter模型實例原理解析

    這篇文章主要介紹了MFC Frame-Splitter模型實例原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • OpenCV實現(xiàn)亂序碎片復原

    OpenCV實現(xiàn)亂序碎片復原

    這篇文章主要介紹了通過OpenCV 直方圖相似度對比,實現(xiàn)將4張打亂順序的碎片拼接復原并展示原圖。文中的示例代碼講解詳細,需要的朋友可以學習一下
    2021-12-12
  • VC++文件監(jiān)控之ReadDirectoryChangesW

    VC++文件監(jiān)控之ReadDirectoryChangesW

    文章主要介紹文件監(jiān)控的另一種實現(xiàn)方式,利用ReadDirectoryChangesW來實現(xiàn)文件的監(jiān)控,希望對大家有幫助
    2019-04-04
  • openCV實現(xiàn)圖像分割

    openCV實現(xiàn)圖像分割

    這篇文章主要為大家詳細介紹了openCV實現(xiàn)圖像分割,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 從string類的實現(xiàn)看C++類的四大函數(shù)(面試常見)

    從string類的實現(xiàn)看C++類的四大函數(shù)(面試常見)

    C++類一般包括構造函數(shù)、拷貝構造函數(shù)、析構函數(shù)和賦值函數(shù)四大函數(shù),非常常見,本文給大家介紹從string類的實現(xiàn)看C++類的四大函數(shù),一起看看吧
    2016-06-06
  • C++高性能服務器框架之線程模塊

    C++高性能服務器框架之線程模塊

    該模塊基于pthread實現(xiàn),sylar說,由于c++11中的thread也是由pthread封裝實現(xiàn)的,并且沒有提供讀寫互斥量,讀寫鎖,自旋鎖等,所以自己封裝了pthread,本文主要詳細介紹了C++高性能服務器框架中的線程模塊,需要的朋友可以參考下
    2023-06-06
  • 適合初學者的C語言常量類型的講解

    適合初學者的C語言常量類型的講解

    常量是固定值,在程序執(zhí)行期間不會改變。這些固定的值,又叫做字面量。常量可以是任何的基本數(shù)據(jù)類型,比如整數(shù)常量、浮點常量、字符常量,或字符串字面值,也有枚舉常量。常量就像是常規(guī)的變量,只不過常量的值在定義后不能進行修改
    2022-04-04

最新評論