C语言排序

1.冒泡排序 Bubble sort

冒泡排序:从后向前让相邻元素两两比较,从而将最小元素移到最前,这个数就是气泡。

#include <stdio.h>
main()
{
    int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
    int n = 9;
    int i, j, temp;
    for (i = 0; i < n; i++)  //i为气泡
        for (j = n-1; j > i; j--)
            if (a[j] < a[j-1])
            {
                temp = a[j];
                a[j] = a[j-1];
                a[j-1] = temp;
            }
    for (int k = 0; k < n; k++)
        printf ("%d ", a[k]);
}

冒泡排序可加入一个标志来提高效率

原理:比如只有序列只需交换最后两个元素,则在第一次for循环中会令bound = n-1,重而提升效率。

#include <stdio.h>
main()
{
    int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
    int n = 9;
    int i, temp, bound, exchange;
    bound = 0;
    while (bound != n-1)
    {
        for (i = n-1; i > bound; i--)
            if (a[i] < a[i-1])
            {
                temp = a[i];
                a[i] = a[i-1];
                a[i-1] = temp;
                exchange = i;
            }
        bound = exchange;
    }
    for (int k = 0; k < n; k++)
        printf ("%d ", a[k]);
}

 

2.插入排序 Insertion sort

插入排序:将第一个元素看作有序数列,对未排序数据,从后向前与有序数列比较,若该数据小,则将与其比较的有序数列值向后移一位(不是交换二者位置),然后继续比较直到找到合适位置插入。

#include <stdio.h>
main()
{
    int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
    int n = 9;
    int i, j, temp;
    for (i = 1; i < n; i++)        //未排序数列
    {
        temp = a[i];
        for (j = i-1; j >= 0; j--)        //己排序数列
            if (temp < a[j])
                a[j+1] = a[j];
        a[j+1] = temp;
    }
    for (int k = 0; k < n; k++)
        printf ("%d ", a[k]);
}

 

3.希尔排序法 Shell sort

希尔排序:希尔排序是插入排序的升级版,它有一个递减增量gap,当gap=1时排序完成,其实直接让gap=1也能达到目的,只是效率不高。下例是直接让gap=1的情况。

#include <stdio.h>
main()
{
    int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
    int n = 9;
    int i, j, temp;
    for (i = 1; i < n; i++)        //未排序
        for (j = i-1; j >=0; j--)    //己排序
            if (a[j+1] < a[j])
            {
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
    for (int k = 0; k < n; k++)
        printf ("%d ", a[k]);
}

对比这段代码和插入排序,区别是这里使用的是直接交换,不是真正的插入,这二者的区别应该不大吧。

 

一般在程序中取gap=n/2,再逐次除2,下面是完整的希尔排序。

#include <stdio.h>
main()
{
    int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
    int n = 9;
    int gap, i, j, temp;
    for (gap = n/2; gap >= 1; gap /=2)
        for (i = gap; i < n; i++)
            for (j = i-gap; j >= 0; j -= gap)
                if (a[j+gap] < a[j])
                {
                    temp = a[j];
                    a[j] = a[j+gap];
                    a[j+gap] = temp;
                }
    for (int k = 0; k < n; k++)
        printf ("%d ", a[k]);
}

 

 

posted @ 2013-10-27 18:34  cnsealine  阅读(202)  评论(0编辑  收藏  举报