zoukankan      html  css  js  c++  java
  • 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]);
    }
  • 相关阅读:
    eth私有节点搭建
    angularjs 文件类型格式校验
    Windows Server 2019, 2016 or 2012 安装telnet
    Oracle导致Redo日志暴增的SQL语句排查
    log4j waf 绕过技巧
    jtemplate使用笔记
    NPOI2.0
    关于java同一个类互相调用,spring事务失效问题
    java 将redis的数据批量取出来的时候遇到json格式转换异常
    超级好用的文档转换工具
  • 原文地址:https://www.cnblogs.com/cnsealine/p/3391091.html
Copyright © 2011-2022 走看看