還算順利,有一些小處細節做得不夠好。
代碼還可以更簡潔一點。不過這次做得比較好的地方是嘗試使用了enum。
希望能對排序算法更熟練:)
#include<stdio.h>
enum{insertion, heap};
void Insert(int list[],int N);
void Heap(int list[], int N);
void Adjust(int list[], int N);
int main(){
int N,list1[100],list2[100];
int i;
int flag;
scanf("%d",&N);
for(i = 0;i < N; i++){
scanf("%d", &list1[i]);
}
for(i = 0;i < N; i++){
scanf("%d", &list2[i]);
}
//判斷是哪一種算法,如果是堆排序第一個肯定是最大的,如果是插入排序第一個肯定是最小的
if(list2[0] < list2[1]){
flag = insertion;
printf("Insertion Sort\n");
}
else{
flag = heap;
printf("Heap Sort\n");
}
if(flag == insertion)
Insert(list2, N);
else
Heap(list2, N);
for(i = 0; i < N - 1; i++)
printf("%d ", list2[i]);
printf("%d", list2[N - 1]);
return 0;
}
void Insert(int list[],int N){
int now = 0, tmp;
while(now < N){
if(list[now + 1] < list[now])
break;
now++;
}
if(now == N)
return;
now++;
tmp = list[now];
//如果這裏的while設置的事now==0的時候也進行循環就不會錯
//否則測試點3,5就過不了(但可以過給的例子)
//應該是題設給的判斷情況是隻做過一次排序
while(--now >= 0){
if(list[now] > tmp)
list[now + 1] = list[now];
else
break;
}
list[now + 1] = tmp;
}
void Heap(int list[], int N){
int now = N - 1, tmp;
while(now > 0){
if(list[now] < list[0])
break;
now--;
}
if(now == 0)
return;
tmp = list[0];
list[0] = list[now];
list[now] = tmp;
Adjust(list, now);
}
//超級臃腫的調整函數,改進空間很大
void Adjust(int list[], int N){
int changeN, nowN;
int tmp;
nowN = N / 2;
while(nowN != 0){
changeN = nowN;
while(1){
//這裏有一個錯誤,是如果把changeN * 2 < N寫成了changeN * 2 !N就會過不了測試點六
//因爲一旦有changeN*2 > N的情況,數組就會在語意上越界
if(changeN * 2 < N && (list[changeN - 1] < list[2 * changeN - 1] || list[changeN - 1] < list[2 * changeN])){
if(list[2 * changeN - 1] > list[2* changeN]){
tmp = list[changeN - 1];
list[changeN - 1] = list[2 * changeN - 1];
list[2 * changeN - 1] = tmp;
changeN = 2 * changeN;
}
else{
tmp = list[changeN - 1];
list[changeN - 1] = list[2 * changeN];
list[2 * changeN] = tmp;
changeN = 2 * changeN + 1;
}
}
else if (changeN * 2 == N){
if(list[2 * changeN - 1] > list[changeN - 1]){
tmp = list[changeN - 1];
list[changeN - 1] = list[2 * changeN - 1];
list[2 * changeN - 1] = tmp;
}
break;
}
else
break;
}
nowN--;
}
}