数据结构排序3-堆排序
生活随笔
收集整理的這篇文章主要介紹了
数据结构排序3-堆排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
堆排序
思想:假設數組放入完全二叉樹中,
1、初始化堆:調節父結點與子結點的大小。讓所有的子結點都小于父結點。
2、將完全二叉樹中的葉子結點和根結點進行互換后,繼續調整堆。直至結束
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<random> #include<time.h> #include<sys/timeb.h> using namespace std; #define MAX 9long getSystemTime() {struct timeb tb;ftime(&tb);return tb.time * 1000 + tb.millitm; //毫秒 }void printArr(int arr[], int length) {for (int i = 0; i < length; i++){printf("%d ", arr[i]);}printf("\n"); } void swapElementme(int* a, int* b) {int temp =*a;*a = *b;*b = temp; }//堆排序 void heapSortme(int arr[], int length) {int mid = length / 2 - 1;int lchild = mid * 2 + 1;int rchild = mid * 2 + 2;int max = mid;//初始化堆for (int i = mid; i < length; i--) {if (arr[i] < arr[lchild]){max = lchild;}if (arr[mid] > arr[rchild]){max = rchild;}if (max != mid){swapElementme(&arr[mid], &arr[max]);}}for (int i = 0; i < length; i++){swapElementme(&arr[0], &arr[length - 1]);heapSortme(arr, length);} }void swapElement(int arr[], int a, int b) {int temp = arr[a];arr[a] = arr[b];arr[b] = temp; } /*@param arr 待調整的數組@param index 待調整的結點的下標@param length 數組長度 */ void heapAdjust(int arr[],int index, int length) {//保存當前結點的下標int max = index;//保存右孩子的數組下標int lchild = index * 2 + 1;//保存左孩子的數組下標int rchild = index * 2 + 2;if (lchild<length && arr[lchild]>arr[max]){max = lchild;}if (rchild<length && arr[rchild]>arr[max]){max = rchild;}if (max != index){//交換兩個結點swapElement(arr, max, index);heapAdjust(arr, max, length);}} void heapSort(int arr[], int length) {//初始化堆for (int i = length/2-1; i >=0; i--){heapAdjust(arr, i, length);}//交換堆頂元素和最后一個元素for (int i = length-1; i >= 0; i--){swapElement(arr, 0,i);heapAdjust(arr, 0, i);} }int main() {int arr[] = { 4,2,8,0,5,7,1,3,9};long t_start = getSystemTime();printArr(arr,MAX);heapSort(arr,MAX);printArr(arr, MAX);long t_end = getSystemTime();printf("堆排序%d個元素,所需時間:%1d\n", MAX, t_end - t_start);system("pause");return 0; }運行結果:
?
?
總結
以上是生活随笔為你收集整理的数据结构排序3-堆排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 根据文件夹大小删除修改时间
- 下一篇: pycharm无法导入本地模块问题