您好,登錄后才能下訂單哦!
#include<stdio.h> void Show(int arr[], int n) { int i; for ( i=0; i<n; i++ ) printf("%d ", arr[i]); printf("\n"); } // 交換數組元素位置 void Swap( int *num_a, int *num_b ) { int temp = *num_b; *num_b = *num_a; *num_a = temp; } // 創建大根堆算法 void HeapAdjust(int a[], int start, int end) { int i,temp; temp = a[start]; for (i = 2*start+1;i<end;i=i*2+1) { if (i+1<end&&a[i]<a[i+1])//右孩子大于左孩子,下標在右孩子上,否則下標在左孩子上 i++;//i代表左右孩子中較大值得下標 if(temp>a[i])//根比左右都大,跳出循環 break; else{ a[start] = a[i];//把孩子子樹中最大的值放在父節點 start = i; } } a[start] = temp; } int* HeapBuild(int array[], int length) { int i; for ( i = length / 2 - 1; i >= 0; i--) { HeapAdjust(array, i, length); } return array; } // 堆排序算法 int* HeapSort(int a[],int length){ int i; a = HeapBuild(a,length); for(i = length-1;i>0;i--){ Swap(&a[0],&a[i]); HeapAdjust(a,0,i); } return a; } int main() { //測試數據 int *a; int arr_test[10] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 }; Show(arr_test,10); a = HeapSort(arr_test,10); Show(a,10); return 0; } 優化: #include <stdio.h> #include <stdlib.h> int * DuiPaixu(int a[],int n){ int end = n,i,t,x,y; while(end >= 1){ while(1){ int flag = 0; i=end/2; while(i > 0){ if(a[i] < a[2*i]){ t = a[i]; a[i] = a[2*i]; a[2*i] = t; flag = 1; } if(2*i+1 <= end&&a[i] < a[2*i+1]){ x = a[i]; a[i] = a[2*i+1]; a[2*i+1] = x; flag = 1; } i--; } if(!flag) break; } y = a[1]; a[1] = a[end]; a[end] = y; end--; } return a; } void Print(int a[],int n){ int i; for(i=1;i<=n;i++){ printf("%5d",a[i]); } } int main(void){ int n,i; int * a; printf("請輸入數組長度n= "); scanf("%d",&n); a=(int*)malloc(n*sizeof(int)); printf("請輸入數組元素: "); for(i=1;i<=n;i++){ scanf("%d",&a[i]); } a = DuiPaixu(a,n); Print(a,n); return 0; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。