数据--第27课 - 初始斗转

第27课 - 初始斗转

1. 选择排序

每一次选出前面的元素最小的元素作为第i个元素。

程序:

#include <stdio.h>

 

void println(int array[], int len)

{

    int i = 0;

   

    for(i=0; i<len; i++)

    {

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

    }

   

    printf("\n");

}

 

void swap(int array[], int i, int j)

{

    int temp = array[i];

   

    array[i] = array[j];

   

    array[j] = temp;

}

 

void SelectionSort(int array[], int len) // O(n*n)

{

    int i = 0;

    int j = 0;

    int k = -1;

   

    for(i=0; i<len; i++)

    {

        k = i;

       

        for(j=i; j<len; j++)

        {

            if( array[j] < array[k] )

            {

                k = j;

            }

        }

       

        swap(array, i, k);

    }

}

 

int main()

{

    int array[] = {21, 25, 49, 25, 16, 8};

    int len = sizeof(array) / sizeof(*array);

   

    println(array, len);

   

    SelectionSort(array, len);

   

    println(array, len);

   

    return 0;

}

 

2. 插入排序

当插入第i个元素的时候,前面的元素都已经排列好了。我们用V[i]的关键字与前面的关键字进行比较,找到插入位置,将V[i]插入即可。原来位置上的对象向后顺移。

程序:

#include <stdio.h>

 

void println(int array[], int len)

{

    int i = 0;

   

    for(i=0; i<len; i++)

    {

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

    }

   

    printf("\n");

}

 

void swap(int array[], int i, int j)

{

    int temp = array[i];

   

    array[i] = array[j];

   

    array[j] = temp;

}

 

void InertionSort(int array[], int len) // O(n*n)

{

    int i = 0;

    int j = 0;

    int k = -1;

    int temp = -1;

   

    for(i=1; i<len; i++)

    {

        k = i;

        temp = array[k];

       

        for(j=i-1; (j>=0) && (array[j]>temp); j--)

        {

            array[j+1] = array[j];

            k = j;

        }

       

        array[k] = temp;

    }

}

 

int main()

{

    int array[] = {21, 25, 49, 25, 16, 8};

    int len = sizeof(array) / sizeof(*array);

   

    println(array, len);

   

    InertionSort(array, len);

   

    println(array, len);

   

    return 0;

}

 

 

3. 冒泡排序

设代排序的数据元素有n个,最多作n-1趟。走一趟选一个。

程序:

#include <stdio.h>

 

void println(int array[], int len)

{

    int i = 0;

   

    for(i=0; i<len; i++)

    {

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

    }

   

    printf("\n");

}

 

void swap(int array[], int i, int j)

{

    int temp = array[i];

   

    array[i] = array[j];

   

    array[j] = temp;

}

 

void BubbleSort(int array[], int len) // O(n*n)

{

    int i = 0;

    int j = 0;

    int exchange = 1;

   

    for(i=0; (i<len) && exchange; i++)

    {

        exchange = 0;

       

        for(j=len-1; j>i; j--)

        {

            if( array[j] < array[j-1] )

            {

                swap(array, j, j-1);

               

                exchange = 1;

            }

        }

    }

}

 

int main()

{

    int array[] = {21, 25, 49, 25, 16, 8};

    int len = sizeof(array) / sizeof(*array);

   

    println(array, len);

   

    BubbleSort(array, len);

   

    println(array, len);

   

    return 0;

}

 

小结:

选择排序,插入排序以及冒泡排序的算法思想简单,而且算法的时间复杂程度都是O(n2)。

这三种排序的算法都是稳定的。

posted @ 2019-08-11 18:35  free-锻炼身体  阅读(158)  评论(0编辑  收藏  举报