2017年5月23日 星期二

資料排序法(Sorting)

氣泡排序(Bubble sorting)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void SelSort(int A[], int n)  //氣泡排序法之副程式
{
    int i, j, k, Temp;
    for(k=0; k<n; k++)
    {
        printf("%d ",A[k]);
    }
    printf("\n ");
    for (i = 0; i < n-1; i++)
    {
        for (j = 0; j < (n-1)-i; j++)
        {
            if (A[j] > A[j+1])
            {
                //相鄰兩個的資料交換位置
                Temp = A[j];
                A[j] = A[j+1];
                A[j+1] = Temp;
            }
            for(k=0; k<n; k++)
            {
                printf("%d ",A[k]);
            }
            printf("\n ");
        }
    }
    return;
}
int main()
{
    int A[6]= {3,78,4,52,34,1};
    int n = 6;
    SelSort( A, n);
    return 0;
}




選擇排序(Selection sorting)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void SelSort(int A[], int n)  //選擇排序法之副程式
{
    int i, j, k, Temp;
    for(k=0; k<n; k++)
    {
        printf("%d ",A[k]);
    }
    printf("\n ");
    for (i = 0; i < n - 1; i++)
    {
        for (j = i + 1; j < n; j++)
        {
            if (A[i] > A[j])
            {
                Temp = A[i];
                A[i] = A[j];
                A[j] = Temp;
            }
            for(k=0; k<n; k++)
            {
                printf("%d ",A[k]);
            }
            printf("\n ");
        }
    }
    return;
}
int main()
{
    int A[6]= {3,78,4,52,34,1};
    int n = 6;
    SelSort( A, n);
    return 0;
}

插入排序(Insertion sorting)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void InSort(int A[], int n)  //插入排序法之副程式
{
    int i, j, k, Temp;


    for (i = 1; i < n; i++)
    {
        for(k=0; k<n; k++)
        {
            printf("%d ",A[k]);
        }
        printf("\n ");
        Temp=A[i];
        j=i-1;
        while (Temp<A[j])
        {
            A[j+1]=A[j];
            A[j]=Temp;
            j--;
            for(k=0; k<n; k++)
            {
                printf("%d ",A[k]);
            }
            printf("\n ");
            if(j==-1)
                break;
        }
        A[j+1]=Temp;
    }
    return;
}

int main()
{
    int A[6]= {3,78,4,52,34,1};
    int n = 6;
    InSort( A, n);
    return 0;
}


快速排序(Quick sorting)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define n 6  //特別用此n的目的是要印出排序法的過程給大家看,然而程式碼中的right是會變動的,所以另外定義n為6(代表本序列的大小)
void QuickSort(int A[], int left, int right)
{
    int i, j, p, k, Temp;
    if(left < right)
    {
        p = A[(left+right)/2];  //pivot→其取點位置是可以自行定義的,有些人是直接取right當作pivot
        printf("pivot = %d\n",p);
        i = left - 1;
        j = right + 1;
        for(k=0; k<n; k++)
        {
            printf("%d ",A[k]);
        }
        printf("\n ");
        while(1)
        {

            while(A[++i] < p);  // 向右找
            while(A[--j] > p);  // 向左找
            if(i >= j) break;
            Temp = A[i];
            A[i] = A[j];
            A[j] = Temp;
        }
        for(k=0; k<n; k++)
        {
            printf("%d ",A[k]);
        }
        printf("\n ");
        QuickSort(A, left, i-1);   // 對左邊進行遞迴
        QuickSort(A, j+1, right);  // 對右邊進行遞迴
    }
    return;
}
int main()
{
    int A[6]= {3,78,4,52,34,1};
    int left = 0,right = 5;
    QuickSort( A,  left, right);
    system("pause");
    return 0;
}


  • 以right當作pivot的範例,這裡需注意:right在

QuickSort(A, left, i-1);

其值會漸漸往左邊靠攏,這是因為i-1的關係,等等大家可以看圖了解會更清楚
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define n 6  //特別用此n的目的是要印出排序法的過程給大家看,然而程式碼中的right是會變動的,所以另外定義n為6(代表本序列的大小)
void QuickSort(int A[], int left, int right)
{
    int i, j, p, k, Temp;
    if(left < right)
    {
        p = A[right];  //pivot→取位置為最後面一個的例子
        printf("pivot = %d\n",p);
        i = left - 1;
        j = right + 1;
        for(k=0; k<n; k++)
        {
            printf("%d ",A[k]);
        }
        printf("\n ");
        while(1)
        {

            while(A[++i] < p);  // 向右找
            while(A[--j] > p);  // 向左找
            if(i >= j) break;
            Temp = A[i];
            A[i] = A[j];
            A[j] = Temp;
        }
        for(k=0; k<n; k++)
        {
            printf("%d ",A[k]);
        }
        printf("\n ");
        QuickSort(A, left, i-1);   // 對左邊進行遞迴
        QuickSort(A, j+1, right);  // 對右邊進行遞迴
    }
    return;
}
int main()
{
    int A[6]= {3,78,4,52,34,1};
    int left = 0,right = 5;
    QuickSort( A,  left, right);
    system("pause");
    return 0;
}


堆積排序(Heap sorting)

薛爾排序(Shell sorting)

合併排序(Merge sorting)

沒有留言:

張貼留言