欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門(mén)教程網(wǎng)!

C語(yǔ)言

當(dāng)前位置:主頁(yè) > 軟件編程 > C語(yǔ)言 >

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

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語(yǔ)言|點(diǎn)擊: 次

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

1. 堆排序

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

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

2. 源代碼

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

這里為了方便,堆從a[1]位置開(kāi)始。

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


源代碼如下:

#include<stdio.h> 
 
int c=0; 
 
/*heapadjust()函數(shù)的功能是實(shí)現(xiàn)從a[m]到a[n]的數(shù)據(jù)進(jìn)行調(diào)整,使其滿足大頂堆的特性*/ 
/*a[]是待處理的數(shù)組,m是起始坐標(biāo), n是終止坐標(biāo)*/ 
void heapadjust(int a[], int m, int n) 
{ 
  int i, temp; 
  temp=a[m]; 
 
  for(i=2*m;i<=n;i*=2)//從m的左孩子開(kāi)始 
  { 
    if(i+1<=n && a[i]<a[i+1])//如果左孩子小于右孩子,則將i++,這樣i的值就是最大孩子的下標(biāo)值 
    { 
      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)建一個(gè)大頂堆 
{ 
  int i; 
  for(i=n/2; i>0; i--)//n/2為最后一個(gè)雙親節(jié)點(diǎn),依次向前建立大頂堆 
  { 
    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);//將第一個(gè)數(shù),也就是從a[1]到a[i]中的最大的數(shù),放到a[i]的位置 
    heapadjust(a, 1, i-1);//對(duì)剩下的a[1]到a[i],再次進(jìn)行堆排序,選出最大的值,放到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; 
} 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。

上一篇:10個(gè)步驟Opencv輕松檢測(cè)出圖片中條形碼

欄    目:C語(yǔ)言

下一篇:Opencv實(shí)現(xiàn)視頻播放與進(jìn)度控制

本文標(biāo)題:C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序源代碼

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/920.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有