4つのソートアルゴリズムのCコード実装

この記事では、Cを使用して、ブーブレソート、選択ソート、挿入ソート、マージソートの4つのソートアルゴリズムを実装します。

この記事は、4つのソートアルゴリズムを説明するアニメーションの続きです。4つのソートアルゴリズムについてよくわからない場合は、振り返ることができます。

コードを最初に置きます:

#include <stdio.h>

// Prints all the elements in an array on one line.
void print_array(int array[], int n,int m)
{
    for(int i = m; i < n; i++)
    {
        printf("%i ", array[i]);
    }
    printf("\n");
}

// Sorts array in place using bubble sort - optimizes to end if there are no swaps
void bubble_sort(int array[], int n)
{
    // cycle through array
    for(int k = 0; k < n - 1; k++)
    {
        // optimize; check if there are no swaps
        int swaps = 0;

        // swap adjacent elements if out of order
        for(int i = 0; i < n - 1 - k; i++)
        {
            if (array[i] > array[i + 1])
            {
                int temp = array[i + 1];
                array[i + 1] = array[i];
                array[i] = temp;

                swaps++;
                print_array(array,n,0);
             }
        }

        if (!swaps)
            break;
    }
}


// Sorts array in place using selection sort
void selection_sort(int array[], int size)
{
    // iterate over array
    for(int i = 0; i < size - 1; i++)
    {
        // smallest element and its position in sorted array
        int smallest = array[i];
        int position = i;

        // unsorted part of array
        for(int k = i + 1; k < size; k++)
        {
            // find the next smallest element
            if (array[k] < smallest)
            {
                smallest = array[k];
                position = k;
            }
        }

        // swap
        int temp = array[i];
        array[i] = smallest;
        array[position] = temp;
        print_array(array,size,0);
    }
}

// Sorts array in place using insertion sort
void insertion_sort(int array[], int size)
{
    // iterate through unsorted part of array from l->r
    for(int i = 1; i < size; i++)
    {
        // define the start of the sorted array
        int j = i - 1;

        // specify the next element to sort
        int to_sort = array[i];

        // iterate through sorted part of array from r->l
        // figure out where in sorted portion to_sort should go
        while(j >= 0 && to_sort < array[j])
        {
            // shift sorted elements rightward
            array[j + 1] = array[j];
            j--;
        }

        // insert element into sorted portion of array
        array[j + 1] = to_sort;
        print_array(array,size,0);
    }
}

// function to sort the subsection a[i .. j] of the array a[]
void merge_sort(int i, int j, int a[], int aux[]) {
    if (j <= i) {
        return;     // the subsection is empty or a single element
    }
    int mid = (i + j) / 2;

    // left sub-array is a[i .. mid]
    // right sub-array is a[mid + 1 .. j]
    printf("begin sort: ");
    print_array(a,j+1,i);

    merge_sort(i, mid, a, aux);     // sort the left sub-array recursively
    merge_sort(mid + 1, j, a, aux);     // sort the right sub-array recursively

    int pointer_left = i;       // pointer_left points to the beginning of the left sub-array
    int pointer_right = mid + 1;        // pointer_right points to the beginning of the right sub-array
    int k;      // k is the loop counter

    // we loop from i to j to fill each element of the final merged array
    for (k = i; k <= j; k++) {
        if (pointer_left == mid + 1) {      // left pointer has reached the limit
            aux[k] = a[pointer_right];
            pointer_right++;
        } else if (pointer_right == j + 1) {        // right pointer has reached the limit
            aux[k] = a[pointer_left];
            pointer_left++;
        } else if (a[pointer_left] < a[pointer_right]) {        // pointer left points to smaller element
            aux[k] = a[pointer_left];
            pointer_left++;
        } else {        // pointer right points to smaller element
            aux[k] = a[pointer_right];
            pointer_right++;
        }
    }

    for (k = i; k <= j; k++) {      // copy the elements from aux[] to a[]
        a[k] = aux[k];
    }
    printf("after merge: ");
    print_array(a,j+1,i);
}


int main(int argc, char *argv[])
{
    int size = 8;
    char  flag='b';
    int nums[] = {6,5,3,1,8,7,2,4};
    int aux[size];

    printf("begin :");
    print_array(nums, size,0);

    // get parameter from command line
    if(argc>1)
    {
        flag=argv[1][0];
    }
    else
        printf("usage: sort1 b(bubble)|s(seleccction)|i(insertion)|m(merge\n");

    if(flag=='b')
    {
    // bubble sort
        printf("Bubble sort\n");
        bubble_sort(nums, size);
    }
    else if (flag=='s')
    {
    // selection sort
        printf("Selection sort\n");
        selection_sort(nums, size);
    }
    else if(flag=='i')
    {
    // insertion sort
        printf("Insertion sort\n");
        insertion_sort(nums, size);
    }
    else if(flag=='m')
    {
    // merge sort
        printf("Merge sort\n");
        merge_sort( 0, size - 1,nums,aux);
    }
    else
        printf("only option b,s,i,m\n");
    printf("end: ");
    print_array(nums, size,0);
}

4つのアルゴリズムは、それぞれ4つの関数で実装されます。

プログラムはパラメータを使用して実行されます。たとえば、プログラム名はsort1です。

次に、sort1 bがバブルで並べ替えられ、sort1mがマージで並べ替えられますsort1sが選択で並べ替えられますsort1iが挿入されますsort

プログラムの実行結果は次のとおりです。

〜/ $ ./sort1 mが                                                                                                                                                        
開始:6 5 3 1 8 7 2 4 
マージソート
のソート開始:6 5 3 1 8 7 2 4 
ソート開始:6 5 3 1 
6 5:ソート開始 
マージ後:5 6 
ソート始めます。 3 1 
マージ後:1 3 
マージ後:1 3 5 6 
ソート開始:8 7 2 4 
ソート開始:8 7 
マージ後:7 8 
ソート開始:2 4 
マージ後:2 4 
マージ後:2 4 
78マージ後:1 2 3 4 5 6 7 8 
終了:1 2 3 4 5 6 7 
8〜 / $ ./sort1 b
開始:6 5 3 1 8 7 24 
バブルソート
5 6 3 1 8 7 2 4 
5 3 6 1 8 7 2 4 
5 3 1 6 8 7 2 4 
5 3 1 6 7 8 2 4 
5 3 1 6 7 2 8 4 
5 3 1 6 7 2 4 8 
3 5 1 6 7 2 4 8 
3 1 5 6 7 2 4 8 
3 1 5 6 2 7 4 8 
3 1 5 6 2 4 7 8 
1 3 5 6 2 4 7 8 
1 3 5 2 6 4 7 8 
1 3 5 2 4 6 7 8 
1 3 2 5 4 6 7 8 
1 3 2 4 5 6 7 8 
1 2 3 4 5 6 7 8 
終了:1 2 3 4 5 6 7 
8〜 / $ ./sort1 s
開始:6 5 3 1 8 7 24 
選択ソート
15 3 6 8 7 2 4 
1 2 3 6 8 7 5 4 
1 2 3 6 8 7 5 4 
1 2 3 4 8 7 5 6 
1 2 3 4 5 7 8 6 
1 2 3 4 5 6 8 7 
1 2 3 4 5 6 7 8 
終了:1 2 3 4 5 6 7 8 
〜/ $ ./sort1 i
begin:6 5 3 1 8 7 24 
挿入ソート56
3 1 8 7 2 4 
3 5 6 1 8 7 2 4 
1 3 5 6 8 7 2 4 
1 3 5 6 8 7 2 4 
1 3 5 6 7 8 2 4 
1 2 3 5 6 7 8 4 
1 2 3 4 5 6 7 8 
終了:1 2 3 4 5 6 7 
8〜 / $ 

 

アルゴリズム関数の中で、マージアルゴリズムはもう少し複雑な場合があり、再帰関数が使用されます。途中から2種類に分けて、マージします。

マージループには、4つのケースがあります。

router_left == mid + 1:左側は空です、

router_right == j + 1:右側は空です

a [pointer_left] <a [pointer_right]:左側の最初<右側の最初

左側の1番目> =右側の1番目

主な機能がわからないと感じた場合は、上記の主な機能を次の主な機能に置き換えることができます。

int main(int argc, char *argv[])
{
    int size = 8;
    char  flag='b';
    int nums[] = {6,5,3,1,8,7,2,4};
    int aux[size];

    print_array(nums, size,0);

    // bubble sort
    //bubble_sort(nums, size);

    // selection sort
    //selection_sort(nums, size);

    // insertion sort
    //insertion_sort(nums, size);

    // merge sort
    merge_sort( 0, size - 1,nums,aux);

    print_array(nums, size,0);
}

このとき、main関数はmain関数であり、コードではマージアルゴリズムのみが呼び出されます。アルゴリズムを変更する場合は、彼の呼び出しをコメントアウトして、必要なアルゴリズムの呼び出しを変更します。実行結果は上記と同じです。

アルゴリズムでは、プロセスを反映するために表示文を追加し、理解できればコメントアウトすることもできます。

紹介は以上です。

 

おすすめ

転載: blog.csdn.net/leon_zeng0/article/details/113449653