1002 寫出這個數,含strcpy和strlen的使用,gets和scanf的區別,白話解釋
阿新 • • 發佈:2021-01-10
採用堆排序堆序對序列R={8,9,2,4,12,52,3}進行排序,並輸出排序後的結果
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 50
typedef int KeyType;
typedef struct {
KeyType key;
}DataType;
typedef struct {
DataType data[MAXSIZE];
int length;
}SqList;
void AdjustHeapss(SqList* H, int s, int m) {
DataType t;
int j;
t = (*H).data[s];
for (j = 2 * s; j <= m; j *= 2) {
if (j < m && (*H).data[j].key < (*H).data[j + 1].key)
j++;
if (t.key > (*H).data[j].key) //如果孩子結點的值小於根結點的值,則不交換
break;
(*H).data[s] = (*H).data[j];
s = j;
}
(*H).data[s] = t; //將根結點插入到正確位置
}
void CreateHeap(SqList* H, int n) { //建立堆
int i;
for (i = n / 2; i >= 1; i--) {
AdjustHeapss(H, i, n); //從序號n/2開始建立
}
}
void Heapsort(SqList* H, int i) { //對順序表H進行堆排序
DataType t;
CreateHeap(H, H->length); //建立堆
for (i = (*H).length; i > 1; i--) {
t = (*H).data[1];
(*H).data[1] = (*H).data[i];
(*H).data[i] = t;
AdjustHeapss(H, 1, i - 1);
}
}
void InitSeqList(SqList* L, DataType a[], int n);
void DispList(SqList L, int n);
void AdjustHeapss(SqList* H, int s, int m);
void CreateHeap(SqList* H, int n);
void Heapsort(SqList* H, int i);
int main() {
DataType a[] = { 8,9,2,4,12,52,3 };
int n = 7;
SqList L;
InitSeqList(&L, a, n);
printf("排序前:");
DispList(L, n);
Heapsort(&L, n);
printf("結果:");
DispList(L, n);
getchar();
return 0;
}
void InitSeqList(SqList* L, DataType a[], int n) { //初始化順序表
int i;
for (i = 1; i <= n; i++)
{
L->data[i] = a[i - 1];
}
L->length = n;
}
void DispList(SqList L, int n) { //輸出表中元素
int i;
for (i = 1; i <= n; i++)
printf("%5d", L.data[i].key);
printf("\n");
}