1. 程式人生 > >資料結構-——排序

資料結構-——排序

#include <stdlib.h>

#include <stdio.h>

#define MAX 50

int slist[MAX]; /*待排序序列*/

 

void insertSort(int list[], int n);

void createList(int list[], int *n);

void printList(int list[], int n);

void heapAdjust(int list[], int u, int v);

void heapSort(int list[], int n);

 

/*直接插入排序*/

void insertSort(int list[], int n)

{

    int i = 1, j = 0, node = 0, count = 1;

    printf("對序列進行直接插入排序:\n");

    printf("初始序列為:");

    printList(list, n);

    for(i = 2; i <= n; i++)

    {

        node = list[i];

        j = i - 1;

        while(j >= 0 && node < list[j])

        {

            list[j+1] = list[j];

            --j;

        }

        list[j+1] = node;

        printf("第%d次排序結果:", count++);

        printList(list, n);

    }

}

/*堆排序*/

void heapAdjust(int list[], int u, int v)

{

    int i = u, j , temp = list[i];

        j = 2 * i;

    while (j <= v)

    {

        if(j < v && list[j] < list[j+1])

            j++; /*若右孩子較大,則把j修改為右孩子的下標*/

        if(temp < list[j])

        {

            list[i] = list[j]; /*將list[j]調到父親的位置上*/

            i = j;

            j = 2 * i; /*修改i和j的值,以便繼續向下篩選*/

        }

        else

            break; /*篩選完成,終止迴圈*/

    }

    list[i] = temp; /*被篩結點的值放入最終位置*/

}

void heapSort(int list[], int n)

{

    int i = 0, temp = 0, count = 1;

    printf("對序列進行堆排序:\n");

    printf("初始序列為:");

    printList(list, n);

    for (i = n  / 2; i > 0; i--)

        heapAdjust(list, i, n); /*建立初始堆*/

    printf("建立的初始堆為:");

    printList(list, n);

    for(i = n ; i > 1; i--)

    {/*迴圈,完成堆排序*/

        temp = list[1];

        list[1] = list[i];

        list[i] = temp; /*將第一個元素同當前區間內最後一個元素對換*/

        heapAdjust(list, 1 , i-1); /*篩選出list[1]結點*/

        printf("第%d次排序結果:", count++);

        printList(list, n);

    }

}

/*生成待排序序列*/

void createList(int list[], int *n)

{

     int i = 1,a;

     printf("請輸入待排序序列(長度小於50,以輸入一個字元結束):\n");

     while(scanf("%d",&a)==1)

     {

        list[i] = a;

        i++;

     }

     *n=i-1;

     getchar();

}

/*輸出排序結果*/

void printList(int list[], int n)

{

     int i = 1;

     for(; i <= n; i++)

     {

         printf("  %d  ", list[i]);

         if(i % 10 ==0 && i != 0)

             printf("\n");

     }

     printf("\n");

}

 

int main()

{

    int choice=1,length;

    while(choice!=0)

    {

        printf("\n");

        printf("***** 內部排序演算法演示程式 *****\n");

        printf("\n1. 直接插入排序 \n");

        printf("\n2. 堆排序 \n");

        printf("\n0. 退出\n");

        printf("\n請選擇:");

        scanf("%d", &choice);

        getchar();

        switch(choice)

        {

        case 1:

            {

                createList(slist, &length);

                insertSort(slist, length);

                break;

            }

        case 2:

            {

                createList(slist, &length);

                heapSort(slist, length);

                break;

            }

        default:choice=0;

        }

        printf("\n");

    }

    return 0;

}

輸入待排序序列:49 38 65 97 13 27 49(以輸入一個字元作為結束)

1) 直接插入排序執行結果(寫出每一趟的狀態):

2)  

 

2)堆排序執行結果(寫出每一趟的狀態):

 

 

 

 

2、在1題中補充希爾排序演算法。

演算法程式碼:

 

void XierSort(int list[], int n)

{

    int i,j, node=0, count=1;

    int m;

    printf("對序列進行希爾排序:\n");

    printf("初始序列為:");

    printList(list, n);

    for(m=n/2; m>0; m/=2)

    {

        for(i=m+1; i<=n;i++)

        {

            node = list[i];

            j=i-m;

            while(j>=1&&node<list[j])

            {

                list[j+m] = list[j];

                j=j-m;

            }

            list[j+m] = node;

            printf("第%d次排序結果:", count++);

            printList(list, n);

        }

    }

}

 

輸入待排序序列:49 38 65 97 13 27 49(以輸入一個字元作為結束)

執行結果(寫出每一趟的狀態):

 

 

 

 

 

3、在1題中補充快速排序演算法。

演算法程式碼:

int Partition(int list[],int low,int high)

{

    //int low1=low,high1=high;

    int key=list[low];

    while(low<high)

    {

        while(low<high && list[high]>=key)

            --high;

        list[low]=list[high];

        while(low<high && list[low]<=key)

            ++low;

        list[high]=list[low];

    }

    list[low]=key;

    return low;

}

void Quicksort(int list[],int low,int high,int n)

{

    int h,i;

    if(low<high)

    {

        h=Partition(list,low,high);

        printList(list, n);

        Quicksort(list,h+1,high,n);

        Quicksort(list,low,h-1,n);

    }

}

 

 

輸入待排序序列:49 38 65 97 13 27 49(以輸入一個字元作為結束)

執行結果(寫出每一趟的狀態):