堆排序

構建堆的時間複雜度爲O(n),而第I次調整堆的時間複雜度爲O(logi),所以,不管什麼狀況下時間複雜度都爲O(nlogn)算法

算法思想:

  首先,對數組從n/2處開始進行建立堆。大頂堆就是頂點老是大於它的子節點,而小頂堆就是定點老是小於它的子節點。數組

  所以,構建時,對節點與他的孩子進行比較,若是建立的是大頂堆,那麼就把最大的孩子跟本身進行比較,比本身大,就進行替換。依次類推。spa

  最後把最頂點的與最後一個元素進行替換,在進行堆的調整,此時的調整,至關於調整最頂點的元素。code

主要代碼:

void heapSort(int *arr,int length){ int i; for(i=length/2; i>0; i--){ sort(arr,i,length); } for(i=length; i>0; i--){ int k = arr[0]; arr[0] = arr[i-1]; arr[i-1] = k; sort(arr,1,i-1); } } void sort(int *arr,int s,int length){ int temp,i; temp = arr[s-1]; for(i=2*s; i<=length; i*=2 ){ if(i<length && arr[i-1] < arr[i]) i++; if(temp >= arr[i-1]) break; arr[s-1] = arr[i-1]; s = i; } arr[s-1] = temp; }

所有代碼:

#include <stdio.h> #include <stdlib.h> #include <time.h>
int arrtest1[10] = {3,4,7,8,0,9,1,2,6,5}; int arrtest2[10] = {0,1,2,3,4,5,6,7,8,9}; int arrtest3[10] = {9,8,7,6,5,4,3,2,1,0}; void copy(int *from,int *arr,int length); void print(int *arr,int length); void heapSort(int *arr,int length); void sort(int *arr,int s,int length); int main(){ clock_t start,end; int Arr[10]; int i; copy(arrtest1,Arr,10); print(Arr,10); heapSort(Arr,10); print(Arr,10); start = clock(); for(i=0;i<100000;i++){ copy(arrtest1,Arr,10); //print(Arr,10);
        heapSort(Arr,10); //print(Arr,10);
 } end = clock(); printf("first test:%d\n",end-start); start = clock(); for(i=0;i<100000;i++){ copy(arrtest2,Arr,10); //print(Arr,10);
        heapSort(Arr,10); //print(Arr,10);
 } end = clock(); printf("first test:%d\n",end-start); start = clock(); for(i=0;i<100000;i++){ copy(arrtest3,Arr,10); //print(Arr,10);
        heapSort(Arr,10); //print(Arr,10);
 } end = clock(); printf("first test:%d\n",end-start); getchar(); return 0; } void heapSort(int *arr,int length){ int i; for(i=length/2; i>0; i--){ sort(arr,i,length); } for(i=length; i>0; i--){ int k = arr[0]; arr[0] = arr[i-1]; arr[i-1] = k; sort(arr,1,i-1); } } void sort(int *arr,int s,int length){ int temp,i; temp = arr[s-1]; for(i=2*s; i<=length; i*=2 ){ if(i<length && arr[i-1] < arr[i]) i++; if(temp >= arr[i-1]) break; arr[s-1] = arr[i-1]; s = i; } arr[s-1] = temp; } void copy(int *from,int *arr,int length){ int i; for(i=0;i<length;i++){ arr[i] = from[i]; } } void print(int *arr,int length){ int i; for(i=0;i<length;i++){ printf("%d ",arr[i]); } printf("\n"); }

運行示例:

相關文章
相關標籤/搜索