演算法導論學習之三:排序之C語言實現:選擇排序,插入排序,歸併排序

趙明威發表於2014-10-04

一、選擇排序

原理圖:

動態原理圖片

選擇排序是先找到起始陣列中最小的元素,將它交換到i=0;然後尋找剩下元素中最小的元素,將 它交換到i=1的位置…… 直到找到第二大的元素,將它交換到n-2的位置。這時,整個陣列 的排 序完成。

#include<stdio.h>
void select_sort(int a[], int ac) ;
void swap(int *a,int *b);
 void print(int arr[],int ac);
int main(void){
    int a[] = {2,1,4,3,2,0,-10,58,-20};
    int ac = sizeof(a)/sizeof(a[0]);
    select_sort(a,ac);    
    print(a,ac);
    return 0;
}
//選擇排序函式 
void select_sort(int a[], int ac) 
{

    /*呼叫 swap*/
    int i,j;
    int min_idx;
    for(j = 0; j < ac-1; j++){
        bool flag = 0;
        min_idx = j;
        for(i = j+1; i < ac; i++){
            if(a[i] <= a[min_idx]) {
                min_idx =i;
                flag = 1;
            }
        }
        if(flag){
        swap(&a[j], &a[min_idx]);
        }
        print(a,ac);
    } 
}
//交換函式swap() 
void swap(int *a,int *b){
    *a = *a^*b;
    *b = *a^*b;
    *a = *a^*b;
} 
//輸出函式 print
 void print(int arr[],int ac){
     //輸出排好的陣列 
    for(int i = 0;i<ac;i++){
        printf("  %d",arr[i]);
    }
    printf("\n");
 }

執行結果如圖:

vamei

二、插入排序

#include<stdio.h>
#include<stdlib.h>
void sort(int a[],int ac);
void print(int arr[],int ac);
int main(void){
    int a[] = {2,1,4,3,2,0,-10,58,-20};
        int ac = sizeof(a)/sizeof(a[0]);
    //呼叫函式 
    sort(a,ac);
    //輸出排好的陣列 
    for(int i = 0;i<ac;i++){
        printf("  %d",a[i]);
    }
    return 0;
}
  //插入排序函式 
    void sort(int a[],int ac){
    int i,j;
    for(j=1;j<ac;j++){
        i=j-1;
        while((i>=0)&&a[i+1]<a[i]){
            //交換兩個數字 
            a[i+1] = a[i+1]^a[i];
            a[i] = a[i+1]^a[i];
            a[i+1] = a[i+1]^a[i];
            i--;
        }
        print(a,ac);
    }
}
    //輸出函式 print
     void print(int arr[],int ac){
         //輸出排好的陣列 
        for(int i = 0;i<ac;i++){
            printf("  %d",arr[i]);
        }
        printf("\n");
     }

執行結果:

enter image description here

三、歸併排序(參考vamei

           /*By Vamei*/
/*recursively merge two sorted arrays*/
#include<stdio.h>
#include<stdlib.h>
void merge_sort(int *a, int ac);
 void print(int arr[],int ac);
int main(void){
    int a[] = {2,1,4,3,2,0,-10,58,-20};
    //陣列長度 
    int ac = sizeof(a)/sizeof(a[0]);

    merge_sort(a,ac);

    print(a,ac);

}
//歸併排序 
void merge_sort(int *a, int ac)
{
    int i, j, k;    
    int ac1, ac2;
    int *ah1, *ah2;
    int *container;

    /*如果分的為一個數字時候,跳出遞迴*/    
    if (ac <= 1) return;

    /*將陣列一分為二*/
    ac1 = ac/2;
    ac2 = ac - ac1;
    ah1 = a + 0;
    ah2 = a + ac1;

    /*recursion*/
    merge_sort(ah1, ac1);
    merge_sort(ah2, ac2);

    /*merge*/
    i = 0;
    j = 0;
    k = 0;
    container = (int *) malloc(sizeof(int)*ac);
    while(i<ac1 && j<ac2) {
        if (ah1[i] <= ah2[j]) {
            container[k++] = ah1[i++];
        } 
        else {
            container[k++] = ah2[j++];
        }
    }
    while (i < ac1) {
        container[k++] = ah1[i++];
    }
    while (j < ac2) {
        container[k++] = ah2[j++];
    }

    /*copy back the sorted array*/
    for(i=0; i<ac; i++) {
        a[i] = container[i];
    }
    /*free space*/
    free(container);
}
    //輸出函式 print
         void print(int arr[],int ac){
             //輸出排好的陣列 
            for(int i = 0;i<ac;i++){
                printf("  %d",arr[i]);
            }
            printf("\n");
         }

相關文章