【作業存檔】堆排序和插入排序的練習

還算順利,有一些小處細節做得不夠好。
代碼還可以更簡潔一點。不過這次做得比較好的地方是嘗試使用了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--;
    }
}









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章