第六章堆排序之“Young氏矩陣(Young tableau)”(思考題6-3)

來源:互聯網
上載者:User

這個程式是利用Young氏矩陣為n*n的數組排序。

其中涉及到:插入法建立Young氏矩陣,然後再調用”去掉返回堆頂元素”的函數得到從小到大的排列。總的時間複雜度為O(n^3)。

其中向Young氏矩陣“插入一個元素”的時間複雜度為O(m+n),m為Young氏矩陣的行數,n為Young氏矩陣的列數,建立Young氏矩陣要插入n*n個元素則為O((n^2)*2n)=O(n^3)。

“去掉返回堆頂元素”因為要藉助“堆調整”函數保持Young氏矩陣的性質,所以時間複雜度為O(m+n)。

在排序函數YoungSort中還調用了尋找函數YoungSearch,這個其實跟排序沒有任何關係,因為排序前先建立Young氏矩陣,所以搭了個便車,建立了Young氏矩陣後立馬調用YoungSearch尋找了仨數。我知道這樣寫很容易產生誤會,特此說明。這個尋找函數YoungSearch()的思想在函數定義中有詳細說明。

詳情請看下面代碼:

#include <string.h>#include <time.h>#define BUFFER_SIZE 3//Young氏矩陣調整 void YoungMinHeapIfy(int (*a)[BUFFER_SIZE+1],int i,int j,int m,int n){int x=0;int y=0;int tmp=0;int min_i=0;int min_j=0;if(j+1<=n&&a[i][j]>a[i][j+1]){min_i=i;min_j=j+1;}else{min_i=i;min_j=j;}if(i+1<=m&&a[min_i][min_j]>a[i+1][j]){min_i=i+1;min_j=j;}if(min_i!=i||min_j!=j){tmp=a[i][j];a[i][j]=a[min_i][min_j];a[min_i][min_j]=tmp;YoungMinHeapIfy(a,min_i,min_j,m,n);}}//去掉並返回堆頂元素 int YoungHeapExtractMin(int (*a)[BUFFER_SIZE+1],int *m,int *n){int tmp=a[1][1];a[1][1]=a[*m][*n];if((*n)>1){(*n)--;}else if((*n)==1){(*m)--;(*n)=BUFFER_SIZE;}YoungMinHeapIfy(a,1,1,*m,*n);return tmp;} //將Young氏矩陣中指定元素(i,j)的關鍵字減小到key,key要小於(i,j)元素原來的關鍵字 void YoungHeapDecreaseKey(int (*a)[BUFFER_SIZE+1],int i,int j,int key){int min_i=0;int min_j=0;if(a[i][j]<=key){return;}a[i][j]=key;if(j>1&&a[i][j]<a[i][j-1]){min_i=i;min_j=j-1;}else{min_i=i;min_j=j;}if(i>1&&a[min_i][min_j]<a[i-1][j]){min_i=i-1;min_j=j; }if(min_i!=i||min_j!=j){a[i][j]=a[min_i][min_j];YoungHeapDecreaseKey(a,min_i,min_j,key);}}//將一個新元素x插入到Young氏矩陣中void YoungMinHeapInsert(int (*a)[BUFFER_SIZE+1],int *m,int *n,int x){if((*n)<BUFFER_SIZE) {(*n)++;}else if((*n)==BUFFER_SIZE){(*m)++;(*n)=1;}a[*m][*n]=x+1;YoungHeapDecreaseKey(a,*m,*n,x);}//尋找指定的某元素是否在Young氏矩陣中void YoungSearch(int (*a)[BUFFER_SIZE+1],int m,int n,int i,int j,int key){if(i>m||i<1||j>n||j<1){//要是下標超出範圍,肯定不存在 printf("%d Not Exist!\n",key);}else if(a[i][j]==key){//每次都先跟最右上方的元素比較,相等就找到了 printf("%d is a[%d][%d]!\n",key,i,j);}else if(a[i][j]>key){//要是小於,就可以去掉最右邊一列 YoungSearch(a,m,n,i,j-1,key);}else if(a[i][j]<key){//要是大於就可以去掉最上面一行 YoungSearch(a,m,n,i+1,j,key);}//這個尋找還有另外一個思路,就是YoungMinHeapInsert的變形,因為裡面涉及到比較了,複雜度也是O(m+n) }//用Young氏矩陣對n*n個元素排序void YoungSort(int (*a)[BUFFER_SIZE+1],int (*b)[BUFFER_SIZE+1],int *c){int m=1;//此處m要從1開始,因為Young矩陣的第0行第0列我都未用 int n=0;int i=0;int j=0;for(i=1;i<=BUFFER_SIZE;i++){for(j=1;j<=BUFFER_SIZE;j++){//先用插入法建堆 YoungMinHeapInsert(a,&m,&n,b[i][j]);}}printf("建立Young氏矩陣:\n");for(i=1;i<BUFFER_SIZE+1;i++){for(j=1;j<BUFFER_SIZE+1;j++){printf("%d\t",a[i][j]);}printf("\n");} printf("\n試著尋找三個數:\n");YoungSearch(a,BUFFER_SIZE,BUFFER_SIZE,1,BUFFER_SIZE,-1000); YoungSearch(a,BUFFER_SIZE,BUFFER_SIZE,1,BUFFER_SIZE,1000);YoungSearch(a,BUFFER_SIZE,BUFFER_SIZE,1,BUFFER_SIZE,a[1][1]);for(i=0;i<BUFFER_SIZE*BUFFER_SIZE;i++){//然後再調用去掉返回堆頂元素的函數得到從小到大的排列 c[i]=YoungHeapExtractMin(a,&m,&n);}}int main(){int i=0;int j=0;int a[BUFFER_SIZE+1][BUFFER_SIZE+1];int b[BUFFER_SIZE+1][BUFFER_SIZE+1];int c[BUFFER_SIZE*BUFFER_SIZE];//隨機產生矩陣srand((unsigned)time(NULL));for(i=1;i<BUFFER_SIZE+1;i++){for(j=1;j<BUFFER_SIZE+1;j++){b[i][j]=rand()%100;}} printf("隨機產生的n*n矩陣:\n");for(i=1;i<BUFFER_SIZE+1;i++){for(j=1;j<BUFFER_SIZE+1;j++){printf("%d\t",b[i][j]);}printf("\n");} YoungSort(a,b,c);printf("對n*n矩陣進行排序:\n"); for(i=0;i<BUFFER_SIZE*BUFFER_SIZE;i++){printf("%d ",c[i]);}system("pause");return 0;} 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.