1 #include "stdio.h" 2 #define N 100 3 typedef int KeyType; 4 typedef char InfoType[10]; 5 typedef struct 6 { 7 KeyType key; 8 InfoType date; 9 10 }RecType; 11 12 //冒泡排序 13 void Bubble_Sort1(RecType R[],int n) 14 { 15 int i,j,temp; 16 //比較相鄰兩個數據,前面的比較大就交換位置 17 for(i=0;i<n;i++) 18 for(j=i+1;j<n;j++) 19 if(R[i].key >R[j].key ) 20 { 21 temp=R[i].key ; 22 R[i].key =R[j].key ; 23 R[j].key =temp; 24 } 25 } 26 //冒泡排序--輸出每一步排序后的結果 27 void Bubble_Sort2(RecType R[],int n) 28 { 29 int i,j,k; 30 RecType temp; 31 for(i=0;i<n-1;i++) 32 { 33 for(j=n-1;j>i;j--) 34 //比較 找出本趟排序的最小關鍵字的記錄 35 if(R[j].key <R[j-1].key )//若改為大於則是最大數沉底 36 {//將最小關鍵字前移 37 temp=R[j]; 38 R[j]=R[j-1]; 39 R[j-1]=temp; 40 } 41 printf("i=%d,冒出最小的關鍵字:%3d,結果為:",i,R[i].key ); 42 for(k=0;k<n;k++) 43 printf("%3d ",R[k].key ); 44 printf("\n\n"); 45 } 46 } 47 48 49 //快速排序 50 void QuickSort(RecType R[],int low,int high) 51 52 { 53 int i=low,j=high,k; 54 RecType temp; 55 temp=R[i]; 56 if(i<j) 57 { 58 while(i!=j) 59 { 60 while(j>i&&R[j].key >temp.key ) 61 j--;//R[j]不變,j前移 62 if(j>i) 63 { 64 R[i]=R[j]; 65 i++; 66 } 67 while( j>i&&R[i].key <temp.key ) 68 i++;//R[i]不變,i前移 69 if(j>i) 70 { 71 R[j]=R[i]; 72 j--; 73 } 74 75 76 } 77 R[i]=temp; 78 printf("划分區間為R[%d...%d],結果為:",low,high); 79 //輸出每趟的排序結果 80 for(k=0;k<10;k++) 81 { if(k==i) 82 printf(" [%d]",R[k].key ); 83 else printf("%5d",R[k].key ); 84 } 85 86 printf("\n"); 87 QuickSort(R,low,i-1);//對左區間遞歸排序 88 89 QuickSort(R,i+1,high);//對右區間遞歸排序 90 } 91 92 } 93 void main() 94 { 95 RecType R[N]; 96 int n=10; 97 int a[]={256,301,751,129,937,863,742,694,76,438}; 98 for( int i=0;i<n;i++) 99 R[i].key =a[i]; 100 101 printf("初始關鍵字序列:\n "); 102 for(i=0;i<n;i++) 103 printf(" %3d ",R[i].key ); 104 printf("\n\n"); 105 Bubble_Sort1(R,n); 106 printf("冒泡排序(從大到小)的結果如下:\n "); 107 for(i=0;i<n;i++) 108 printf(" %3d ",R[i].key ); 109 printf("\n\n\n"); 110 111 for( i=0;i<n;i++) 112 R[i].key =a[i]; 113 printf("\n初始關鍵字序列:\n "); 114 for(i=0;i<n;i++) 115 printf(" %3d ",R[i].key ); 116 printf("\n\n"); 117 Bubble_Sort2(R,n); 118 printf("最后結果:\n"); 119 for(i=0;i<n;i++) 120 printf(" %3d ",R[i].key ); 121 printf("\n"); 122 123 for( i=0;i<n;i++) 124 R[i].key =a[i]; 125 printf("\n\n初始關鍵字序列:\n "); 126 for(i=0;i<n;i++) 127 printf(" %3d ",R[i].key ); 128 printf("\n\n"); 129 QuickSort(R,0,n-1); 130 printf("最后結果:\n"); 131 for(i=0;i<n;i++) 132 printf(" %3d ",R[i].key ); 133 printf("\n"); 134 135 }
在實現快速排序算法時,弄成了死循環,一直找不出來問題在哪里,調試之后發現是輸出結果中for循環本應該是for(k=0;k<n;k++)的語句寫成了for(k=0;k<n;i++)使得k<n恆成立,然后就變成死循環了。(害我找得好苦)經過前面的大量訓練,我已經能夠不參考PPT的代碼自己寫出代碼了(當然前提是弄懂算法實現的過程),也慢慢覺得編程編得簡單了。努力了總是會有收獲的,越努力越幸運!