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 }