zoukankan      html  css  js  c++  java
  • 排序算法学习之简单排序(冒泡排序,简单选择排序,直接插入排序)

    一、冒泡排序

        冒泡排序算是最基础的一种算法了,复杂度为O(N^2),其基本思想是:从最低端数据开始,两两相邻比较,如果反序则交换。代码如下:

    /*最基本的冒泡排序*/
    void BubbleSort1 (int n, int *array)    /*little > big*/
    {
        int i, j;
        for (i=0; i<n-1; i++)
        {
            for (j=n-1; j>i; j--)
            {
                if (array[j] < array[j-1])
                {
                    int temp = array[j];
                    array[j] = array[j-1];
                    array[j-1] = temp;
                }
            }
        }
    }

        优化:例如序列{2,1,3,4,5,6,7,8,9},当i=1时,整个序列已然有序,但是还是会进行i=3,4,5,6,7,8,9的循环,可以从此处进行优化,如果某一次冒泡未发生数据交换,则证明整个序列已然有序,之后不需要继续循环。通过设置flag变量实现,代码如下:

    void BubbleSort2 (int n, int *array)
    {
        int i, j, flag=1;    /*flag=1表示需要继续冒泡*/
        for (i=0; i<n-1 && flag; i++)
        {
            flag = 0;
            for (j=n-1; j>i; j--)
            {
                if (array[j] < array[j-1])
                {
                    int temp = array[j];
                    array[j] = array[j-1];
                    array[j-1] = temp;
                    flag = 1;
                }
            }
        }
    }

    二、简单选择排序

        冒泡排序是相邻元素比较交换,而简单选择排序是只比较不交换,只有遍历一遍找出最小(大)值,再与前面的交换,其时间复杂度是O(N^2),代码如下:

    void SelectSort (int n, int *array)
    {
        int i, j, min;
        for (i=0; i<n-1; i++)
        {
            min = i;
            for (j=i+1; j<n; j++)
            {
                if (array[min] > array[j])
                    min = j;
            }
            int temp = array[min];
            array[min] = array[i];
            array[i] = temp;
        }
    }

    三、直接插入排序

        直接插入排序的基本思想是:将一个数插入到有序列表的合适位置,从而得到新的有序列表。其时间复杂度是O(N^2),代码如下

    void InsertSort (int n, int*array)
    {
        int i, j;
        for (i=1; i<n; i++)
        {
            if (array[i] < array[i-1])    /*是否需要插入*/
            {
                int key = array[i];    //哨兵
                for (j = i-1;j>=0 && array[j] > key; j--)
                {
                    array[j+1] = array[j];
                }
                /*循环结束时array[j]<=key,将key插入到j+1处*/
                array[j+1] = key;
            }
        }
    }

    总结:冒泡排序,简单选择排序,直接插入排序的时间复杂度都是O(N^2),但整体上直接插入排序>简单选择排序>,冒泡排序。

  • 相关阅读:
    排列 POJ
    [kuangbin带你飞]专题二十一 概率&期望 部分题解
    队列最大值&滑动窗口最大值【剑指offer】
    Python实现可视化界面多线程豆瓣电影信息爬虫,并绘制统计图分析结果
    剑指offer【复杂链表的复制】
    树上博弈——从根节点先后走向叶子节点输赢【递归水题】
    给一个长度为n的字符串,找出长度为m的最小字典子序列【单调栈】
    Hrbust 1814 小乐乐的化妆品【01背包】
    Hrbust 1541集合划分 & Hrbust 2002幂集【dp】
    Hrbust 1333 GG的关心【01背包】
  • 原文地址:https://www.cnblogs.com/lifan/p/3718449.html
Copyright © 2011-2022 走看看