數據結構之排序(冒泡排序、快速排序)


  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的代碼自己寫出代碼了(當然前提是弄懂算法實現的過程),也慢慢覺得編程編得簡單了。努力了總是會有收獲的,越努力越幸運!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM