日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构排序3-堆排序

發布時間:2025/3/15 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构排序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-堆排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。