排序演算法——堆排序(大頂堆、小頂堆)
堆排序的思想這裡就先不講了,以後有時間再補上,下面是分別採用大頂堆和小頂堆實現的堆排序。
注意:下面例子中排序的數字是{1,2,5,3,6,4,9,7,8}。
大頂堆方式
#include <iostream>
#include <stdlib.h>
using namespace std;
//堆調整
//將nums[s..m]調整為大頂堆,其中除了nums[s]之外均滿足大頂堆的定義
void HeapAdjust(int nums[],int s, int m)
{
int j;
nums[0] = nums[s]; //nums之後跟新為該節點作為根節點的所有子孫的關鍵字最大值
for(j = 2 * s;j <= m;j *=2 ) //沿著關鍵字較小的孩子向下篩選
{
if(j < m && nums[j] < nums[j + 1])
j++; //j為關鍵字中較大的記錄的下標
if(nums[0] >= nums[j])
break; //滿足大頂堆條件,直接跳出
nums[s] = nums[j];
s = j;
}
nums[s] = nums[0];
}
void HeapSort(int nums[],int n)
{
//調整為大頂堆
for(int i = n/2; i > 0; i--)
{
HeapAdjust(nums, i, n);
}
//將整個根節點根節點最後一個子節點進行交換
for(int i = n; i > 1; i--)
{
swap(nums[1],nums[i]);
HeapAdjust(nums, 1, i -1);
}
}
int main()
{
int nums[10] = {-1,1,2,5,3,6,4,9,7,8};
HeapSort(nums,9 );
cout<< "排序結果:";
for(int i = 1; i < 10;i++)
{
cout<< nums[i]<< " ";
}
system("pause");
return 0;
}
小頂堆方式
#include <iostream>
#include <stdlib.h>
using namespace std;
//堆調整
//將nums[s..m]調整為小頂堆,其中除了nums[s]之外均滿足小頂堆的定義
void HeapAdjust(int nums[],int s, int m)
{
int j;
nums[0] = nums[s]; //nums之後跟新為該節點作為根節點的所有子孫的關鍵字最小值
for(j = 2 * s;j <= m;j *=2 ) //沿著關鍵字較小的孩子向下篩選
{
if(j < m && nums[j] < nums[j + 1])
j++; //j為關鍵字中較小的記錄的下標
if(nums[0] >= nums[j])
break; //滿足小頂堆條件,直接跳出
nums[s] = nums[j];
s = j;
}
nums[s] = nums[0];
}
void HeapSort(int nums[],int n)
{
//調整為小頂堆
for(int i = n/2; i > 0; i--)
{
HeapAdjust(nums, i, n);
}
//將整個根節點根節點最後一個子節點進行交換
for(int i = n; i > 1; i--)
{
swap(nums[1],nums[i]);
HeapAdjust(nums, 1, i -1);
}
}
int main()
{
int nums[10] = {-1,1,2,5,3,6,4,9,7,8};
HeapSort(nums,9);
cout<< "排序結果:";
for(int i = 1; i < 10;i++)
{
cout<< nums[i]<< " ";
}
system("pause");
return 0;
}
相關推薦
經典排序演算法的實現(選擇,插入,shell,堆,快速,歸併排序)
1.選擇排序 //選擇排序 void selectSort(int * arr, int n) { for (int i = 0; i < n - 1; i++) { int min = arr[i]; int minPos = i; for (int j = i
排序演算法--選擇篇(簡單選擇,樹形選擇,堆排序)
選擇類排序的基本思想是每一趟在n-i+1(i=1,2,...,n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。本篇在介紹簡單選擇排序的基礎上,給出了其改進演算法--樹形選擇排序和堆排序。 1.簡單選擇排序 演算法思想:第一趟簡單選擇排序時,從第一個記錄開始,
八大排序演算法JAVA實現(時間複雜度O(n-logn)篇)
本文講述時間複雜度為n*logn的排序演算法:歸併排序、快速排序、堆排序以及希爾排序的原理、Java實現以及變形應用。 一、歸併排序 原理:把兩個有序數列合併為一個有序數列。需遞迴實現。 Java實現: 1 public int[] mergeSort(in
八大排序演算法JAVA實現(時間複雜度O(n-n)篇)
本文主要描述3個時間複雜度為n2的排序演算法:氣泡排序、選擇排序、插入排序。 1.氣泡排序:由陣列頭部開始,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。每次交換完成後,當前陣列最大值就會被放在最後。 1 public int[] bubbleSort
排序演算法——堆排序(大頂堆、小頂堆)
堆排序的思想這裡就先不講了,以後有時間再補上,下面是分別採用大頂堆和小頂堆實現的堆排序。 注意:下面例子中排序的數字是{1,2,5,3,6,4,9,7,8}。 大頂堆方式 #include &
常見排序演算法C++實現(冒泡,直接插入,希爾,堆,歸併,簡單選擇,快排)
常見的排序演算法:氣泡排序、直接插入、希爾排序,堆排序,簡單選擇排序,快速排序。這些最基本的演算法都是應該熟練掌握的,下面是C++實現的程式碼,方便大家學習參考: #include<iostream> using namespace std; void swa
常見比較排序演算法的實現(歸併排序、快速排序、堆排序、選擇排序、插入排序、希爾排序)
這篇部落格主要實現一些常見的排序演算法。例如: //氣泡排序 //選擇排序 //簡單插入排序 //折半插入排序 //希爾排序 //歸併排序 //雙向的快速排序(以及快速排序的非遞迴版本) //單向的快速排序 //堆排序 對於各個演算法的實現
九種經典排序演算法詳解(氣泡排序,插入排序,選擇排序,快速排序,歸併排序,堆排序,計數排序,桶排序,基數排序)
綜述 最近複習了各種排序演算法,記錄了一下學習總結和心得,希望對大家能有所幫助。本文介紹了氣泡排序、插入排序、選擇排序、快速排序、歸併排序、堆排序、計數排序、桶排序、基數排序9種經典的排序演算法。針對每種排序演算法分析了演算法的主要思路,每個演算法都附上了虛擬
資料結構和演算法分析之排序演算法--選擇排序(堆排序)
選擇排序–堆排序 堆排序是一種樹形選擇的排序,是對直接選擇排序的有效改進。 (直接選擇排序:第一次選擇最小值,與第一位數交換,再從後面選擇最小的,和第二位數交換……直至排序結束,共n-1次) 基本思想: 堆的定義如下:具有n個元素的序列(k1,k2,…,
基礎排序演算法 java 實現(冒泡、選擇、插入、快排、歸併、堆排)
package demo; import java.util.Arrays; public class SortUtil { private static void printArr(int[] arr) { System.out.println
十大排序演算法的實現 十大經典排序演算法最強總結(含JAVA程式碼實現)
十大經典排序演算法最強總結(含JAVA程式碼實現) 最近幾天在研究排序演算法,看了很多部落格,發現網上有的文章中對排序演算法解釋的並不是很透徹,而且有很多程式碼都是錯誤的,例如有的文章中在“桶排序”演算法中對每個桶進行排序直接使用了Collection.sort
經典排序演算法——快速排序、歸併排序、堆排序
之前兩篇關於排序演算法的綜述以及平方階複雜度的3種具體型別的排序演算法,這一篇將具體介紹其中平均時間複雜度在平方階O(nlog2n)O(nlog_2n)O(nlog2n)的三個排序演算法,以及各種演算法的程式碼實現(親測正確)。 快速排序 快速排序是由東尼·霍
堆排序,分別利用大根堆、小根堆排序
#include <iostream> using namespace std; //下沉調整(本質上都是上浮調整,只不過是將最小元素上浮) void downAdjust(int array[],int parentIndex,int length) { in
7種經典排序演算法Java程式碼實現(冒泡+選擇+插入+歸併+快排+堆排序+希爾)
氣泡排序 氣泡排序的原理是:比較兩個相鄰的元素,將值較大的元素交換到至右端(比較+移動) public static void sortMpao(int[] num) { for(int i = 1; i < num.length; i++) {
十大排序演算法及其實現(C++ & Python)
經典的幾大排序演算法,網上各種版本程式碼質量層次不齊。在此想自己做個總結,一方面希望通過這次總結加深自己對幾種排序演算法的認識和記憶,另一方面也希望能寫下來與大家分享。 每個演算法力求給出普通解法和最優解法,當前部分排序演算法還沒有給出最優解,待後續的
[大、小根堆應用總結一]堆排序的應用場景
前言 在整理演算法題的時候發現,大根堆(小根堆)這種資料結構在各類演算法中應用比較廣泛,典型的堆排序,以及利用大小根堆這種資料結構來找出一個解決問題的演算法最優解。因此,我打算單獨將關於堆的應用
【C++實現】基本排序演算法 插入排序——歸併排序——快速排序——堆排序
/* 排序總結:(基於100w隨機數,有序數、重複數測試) 1、插入排序適合近乎有序的序列 2、歸併排序優化:(優化前 120S) 1)資料小於15時採用插入排序 10S 2)避免頻繁動態申請記憶體 memcpy(dest,src,sizeof(int)*len)
Java-時間複雜度為O(nlogn)的排序演算法(快速排序, 歸併排序, 堆排序, 希爾排序)
/** 包含多種靜態排序方法 * Created by Andre on 2016/6/27. */ public class Sorter { /** * 快速排序 * 遞迴形式 * 第一個記錄為樞軸 * 不穩定
排序演算法之選擇排序(關鍵詞:資料結構/演算法/排序演算法/選擇排序)
假定:有 1 個亂序的數列 nums ,其中有 n 個數。 要求:排好序之後是 從小到大 的順序。 選擇排序演算法 程式碼 from swap import swap def select_sort(nums): n = len(nums) i = 0 while
排序演算法之插入排序(關鍵詞:資料結構/演算法/排序演算法/插入排序)
假定:有 1 個亂序的數列 nums ,其中有 n 個數。 要求:排好序之後是 從小到大 的順序。 插入排序演算法 程式碼 def insert_sort(nums): i = 1 n = len(nums) while i <= n-1: j = i