堆排序——C語言
關於堆不做過多解釋(要說的話有點多....)要學堆排序的話對堆肯定有一定的理解。
首先從堆頂開始,自左向右依次標號的話(0..n),我們可以發現父子節點的關係
(首標為0時)i為父;則左子為2i+1;右子為2i+2;
要實現堆排序,
1:將無序堆變成有序。
2:堆頂元素與堆尾元素交換後,去掉堆尾(此時堆尾最大或者最小,不需要再調整),調整剩下的(因為前面交換首尾,所以堆得有序結構改變了,需要重新調整),使其變成一個有序堆。
(可能我說的不太詳細,具體請參照資料結構(C語言版)(第2版)嚴蔚敏老師的)
本來想拍下來,貼上圖的.........但是一想,自己翻看,記憶更深刻!!!(實際...我懶.....)
下面貼上我的程式碼
結果圖
主要程式碼:
如有錯誤,歡迎指正
相關推薦
資料結構之堆排序C語言實現
堆排序: 時間複雜度:O(nlogn) 穩定性:不穩定 實現原理:將待排序的序列構造成一個大頂堆(或小頂堆) 整個序列的最大值就是堆頂的根節點,將它移走 (就是將其與對陣列的末尾元素交換,此時末尾元素就是最大值)。然後將剩餘的n-1個序列重新 構成
堆排序C語言程式碼
#include<stdio.h> int heap_size; //建堆時參與的元素個數 int parent(int i); //三個節點關係函式 i
堆排序——C語言
關於堆不做過多解釋(要說的話有點多....)要學堆排序的話對堆肯定有一定的理解。首先從堆頂開始,自左向右依次標號的話(0..n),我們可以發現父子節點的關係(首標為0時)i為父;則左子為2i+1;右子為2i+2;要實現堆排序,1:將無序堆變成有序。2:堆頂元素與堆尾元素交換後
歸併排序,快速排序,堆排序,氣泡排序 c語言原始碼
1.歸併排序#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 50000 void merge(int [],int,int,int);//歸併排序數組
排序(3)---------冒泡排序(C語言實現)
std 強調 tracking i++ oid printf pre rand() 執行 說到冒泡排序,大一的時候第一次學習這個排序算法,可能大家不知道,“冒泡”在我說的方言裏面是吹牛逼的意思。所以就認為這個排序算法特吹牛逼有木有。 相信大家對全部的排
堆排序 C++實現
logs pso int brush -- cpp end tac 排序 #include<iostream> #include<vector> #include<stack> #include<algorithm> #in
桶排序——C語言
桶排序是一種常見的排序方式。其主要是先確定一定大小的桶,再將陣列數值存入桶的對應下標中,最後對非空桶進行排查,將桶的數值賦給數值。 程式碼實現: /**桶排序**/ void bucket(int *data)///隨機產生data陣列的值 { int t;
直接插入排序——C語言
插入排序是最簡單的一種排序方法。它的基本操作就是將一個記錄插入到已排好序的有序表中,從而得到一個新的、記錄數增1的有序表。 直接插入排序時,我們將第二個陣列元素作為插入數,第一個數作為有序陣列。逐個比較兩者大小,最後將數插入到合適位置。 程式碼實現: /**插入排序**
快速排序——C語言
快速排序是對氣泡排序的一種改進。 其基本思想是:通過一趟排序將待排記錄分割成兩部分,其中一部分記錄的關鍵字均比另一記錄的關鍵字小,則可對這兩部分記錄繼續進行排序,以達到整個序列有序。 程式碼實現: int partition1(int data[],int low,in
氣泡排序--c語言面向物件的使用
/************************************************** File Name: maopao.c Author: hebowen Mail: [email protected] Created Time:
希爾排序C語言版
希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本. 希爾排序的基本思想就是:將需要排序的序列劃分為若干個較小的序列,對這些序列進行直接插入排序,通過這樣的操作可使需要排序的數列基本有序,最後再使用一次直接插入排
特殊排序 C語言實現
題目描述 輸入一系列整數,將其中最大的數挑出,並將剩下的數進行排序。 輸入描述 輸入第一行包括1個整數N,1<=N<=1000,代表輸入資料的個數。 接下來的一行有N個整數。 輸出描述 可能有多組測試資料,對於每組資料, 第一行輸出一個整數,代表N個整數中
【演算法】希爾排序C語言實現
上一篇文章我們一起學習了直接插入排序,它的原理就是把前i個長度的序列變成有序序列,然後迴圈迭代,直至整個序列都變為有序的.但是說來說去它還是一個時間複雜度為(n^2)的演算法,難道就不能再進一步把時間複雜度降低一階麼?可能有很多同學說快速排序,堆排序,我都會,這些簡單的插
排序(6)---------歸併排序(C語言實現)
歸併排序: 歸併操作,也叫歸併演算法,指的是將兩個已經排序的序列合併成一個序列的操作。歸併排序演算法依賴歸併操作。 歸併操作的過程如下: (1) 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列 (2) 設定兩個指標,最初位置分別為兩個
CCF CSP認證考試歷年真題 數字排序 C語言實現
試題編號:201503-2 試題名稱:數字排序 時間限制:1.0s 記憶體限制:256.0MB 問題描述: 問題描述 給定n個整數,請統計出每個整數出現的次數,按出現次數從多到少的順序輸出。 輸入格式 輸入的第一行包含一個整數n,表示給定數字的個數。第二行包含n個整數,相鄰
歸併排序(C語言版)
先說說歸併排序的思想: 歸併排序法是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個有序的子序列,再把有序的子序列合併為整體有序序列。 穩定性和複雜度: 歸併排序是穩定的排序演算法,時間複雜度最壞為O(n*logn),平均為O(n*logn),空間複
氣泡排序(C語言實現)
今天說說氣泡排序演算法。 氣泡排序的思想:就像氣泡一樣讓最小的(或者最大的)浮到最上面,一個個接著浮上來,整個排序完成。 請看圖 這樣一趟排序已完成,此時最小值就會浮到最上面(即水面上)</p><p>這是整個氣泡排序的思想,如果這玩意理解了,那麼程式
插入排序C語言實現程式碼
<span style="font-size:18px;">#include<stdio.h> void main() { int A[6]={5,2,4,6,1,3};
CSP考試 2015年03月第2題 數字排序 C語言實現
#include <stdio.h> int main() { int NUM; scanf("%d",&NUM); int a[NUM]; int b[1001]; int i,j; for(i=0;i<NUM;i+
排序演算法之歸併排序 ( C語言版 )
歸併排序 :(Merge Sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,