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的代码自己写出代码了(当然前提是弄懂算法实现的过程),也慢慢觉得编程编得简单了。努力了总是会有收获的,越努力越幸运!