• 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]);
    }
  • 相关阅读:
    ant
    maven 构建web项目
    什么叫openapi
    dubbo学习
    Java 获取环境变量
    配置文件书写对象的几种方式
    怎么改svn的登陆账号
    Android 它们的定义View (一)
    eclipse建立cocos2d-x开发环境
    Android——采用SQLiteDatabase操作SQLite数据库
  • 原文地址:https://www.cnblogs.com/cnsealine/p/3391091.html
Copyright © 2020-2023  润新知