数据结构之排序(选择排序、堆排序)

  1 //选择排序和推排序
  2 
  3 #include "stdio.h"
  4 #define MAX 20
  5 typedef int KeyType;
  6 typedef char InfoType[10];
  7 typedef struct
  8 {
  9     KeyType key;
 10     InfoType data;
 11 }RecType;
 12 
 13 void Sel_Sort(RecType R[],int n)
 14 {
 15     int i,j,k,l;
 16     RecType temp;
 17     //找到关键序列中的最小关键字
 18     for( i=0;i<n-1;i++)    
 19     {
 20         k=i;
 21         for( j=i+1;j<n;j++)
 22             if(R[k].key  >R[j].key )
 23                 k=j;//记录最小关键字的所造位置
 24             printf("\n关键字序列中最小关键字为%d\n",R[k].key  );
 25         //找到的最小关键字位置与当前i不符则交换R[j]和R[k]
 26         if(k!=i)
 27         {
 28             temp=R[i];
 29             R[i]=R[k];
 30             R[k]=temp;
 31         }
 32         printf("第%d趟排序 :选择的关键字:%d,结果为:",i+1,R[i].key );
 33         //输出每一趟排序的结果
 34         for(l=0;l<n;l++)
 35             printf("%3d ",R[l].key );
 36         printf("\n");
 37 
 38     
 39     }
 40             
 41 
 42 }
 43 
 44 //输出建立的堆
 45 void DispHeap(RecType R[],int i,int n)
 46 {
 47     if(i<=n)
 48         printf("%d ",R[i].key );
 49     if(2*i<=n||2*i+1<n)
 50     {
 51         printf("(");
 52         if(2*i<=n)
 53             DispHeap(R,2*i,n);//递归调用输出左子树
 54         printf(",");
 55         if(2*i+1<=n)
 56             DispHeap(R,2*i+1,n);//递归调用,输出右子树
 57         printf(")");
 58     }
 59 }
 60 
 61 //调整堆(小根堆)大根堆类似
 62 void Sift(RecType R[],int low,int high)
 63 {
 64     int i=low,j=2*i;//R[j]是R[i]的左孩子
 65     RecType temp=R[i];
 66     while(j<=high)
 67     {
 68         if( j < high && R[j].key > R[j+1].key )//若右孩子较大,把j指向右孩子
 69             j++;
 70         if(temp.key > R[j].key)
 71         {
 72             R[i]=R[j];//将R[j]调整到双亲节点的位置上
 73             i=j;      //修改i和j 的值,以便于继续向下筛选
 74             j=2*i;
 75         }
 76         else break;
 77     }
 78     R[i]=temp;
 79 }
 80 int count=1;
 81 //堆排序
 82 void HeapSort(RecType R[], int n)
 83 {
 84     int i,j;
 85     RecType temp;
 86     for(i=n/2;i>=1;i--)//从第一个非终端节点开始筛选
 87         Sift(R,i,n);
 88     printf(" 初始堆:");
 89     DispHeap(R,1,n);
 90     printf("\n");
 91     for(i=n;i>=2;i--)
 92     {
 93         printf("\n第%d趟排序:\n",count++);
 94         printf(" 交换%d与%d,输出%d\n",R[i].key ,R[1].key ,R[1].key );
 95         temp=R[1];
 96         R[1]=R[i];
 97         R[i]=temp;
 98         printf(" 排序结果:");
 99         for( j = 1; j < n ; j++)
100             printf("%d ",R[j].key );
101         printf("\n");
102         Sift(R,1,i-1);
103         printf("筛选调整后得到的堆:");
104         DispHeap(R,1,i-1);
105         printf("\n");
106     }
107 }
108 
109 
110 
111 void main()
112 {
113     int i,k, n=6;
114 
115 
116     int a[]={46,79,56,38,40,84};
117     RecType R[MAX];
118     
119     //选择排序
120     for( i=0;i<6;i++)
121         R[i].key =a[i];
122     printf("选择排序\n初始关键字:");
123     for(k=0;k<n;k++)
124         printf("%3d ",R[k].key );
125     printf("\n");
126     Sel_Sort(R,n);
127     printf("\n最后结果:");
128     for(k=0;k<n;k++)
129         printf("%3d ",R[k].key );
130     printf("\n\n");
131 
132     //堆排序
133     for( i=1;i<=6;i++)
134         R[i].key =a[i-1];//为了便堆得筛选,序号保持一致
135     printf("堆排序(以括号表示法输出建立的推,建立成小根堆)\n初始关键字:");
136     for(k=0;k<n;k++)
137         printf("%3d ",R[k].key );
138     printf("\n");
139     for(i=n/2;i>=1;i--)
140         Sift(R,i,n);
141     HeapSort(R,n);
142 
143     
144     printf("\n最后结果(顺序存储):");
145     for(k=1;k<=n;k++)
146         printf("%3d ",R[k].key );
147     printf("\n");
148 
149 
150     
151 }
posted @ 2016-12-13 19:39  梦想起航2016  阅读(226)  评论(0编辑  收藏  举报