续说排序

作者: 诺馨 | 来源:发表于2016-06-23 18:53 被阅读112次

接着上一篇文章常用的排序,继续说排序,剩下的还有直接插入排序,直接选择排序和堆排序,默认排序顺序仍是递增排序。废话不多说了,开始进入正题。

插入排序其实分为:直接插入排序二分插入排序(或折半插入排序),希尔排序,其基本思想就是:每次将一个待排序的记录,按其关键字的大小插入到前面已经排好序的子表中的适当位置,直到全部记录插入完成为止。在这里只介绍直接插入排序。

直接插入排序

直接先来代码好了。

void InsertSort(RecType R[],int n)
{
    int i,j;
    RecType tmp;
    for (int i = 1; i < n; i++)
    {
        tmp = R[i];
        j = i - 1;
        while(j >= 0 && tmp.key < R[j].key)
        {
            R[j+1] = R[j];
            j--;
        }
        R[j+1] = tmp;
    }
}

此排序的操作过程为:假设有一序列为(6,3,7,5,1,4,2,9),刚开始时i = 1,j = 0,有序区暂时只有R[0]一个记录。从6起,从右向左查找,3小于6,将6右移一个位置,j-- 后while条件不满足了,结束while循环,将3插入R[0]的位置,此时序列变为(3,6,7,5,1,4,2,9),第一趟排序结束。接下来第二趟排序,i = 2,待插入的记录为R[2] = 7,从6开始从右向左查找。7大于6,while条件不满足,所以7的位置不变。此时序列变为(3,6,7,5,1,4,2,9),第三趟排序...以此类推,直到所有记录都有序为止。

初始序列:6 3 7 5 1 4 2

i = 1: <b><u>3</u></b> 6 7 5 1 4 2 9
i = 2: 3 6 <b> <u>7</u></b> 5 1 4 2 9
i = 3: 3 <b><u>5</u></b> 6 7 1 4 2 9
i = 4: <b><u>1</u></b> 3 5 6 7 4 2 9
i = 5: 1 3 <b> <u>4</u></b> 5 6 7 2 9
i = 6: 1 <b><u>2</u></b> 3 4 5 6 7 9
i = 7: 1 2 3 4 5 6 7 <b> <u>9</u></b>

选择排序的基本思想是:每一趟排序是从待排序的记录中选出关键字最小的记录,顺序放在已排好序的记录序列的末尾,直到全部记录排序完毕。常用的选择排序方法有直接选择排序(或简单选择排序)以及 堆排序。

直接选择排序

void selectSort(RecType R[],int n)
{
    int i,j,k;
    RecType tmp;
    for (int i = 0; i < n - 1; i++)
    {
        k = i;
        for (int j = i + 1; j < n; j++)
            if (R[j].key < R[k].key)
                k = j;
        if (k != i)
        {
            tmp = R[i];
            R[i] = R[k];
            R[k] = tmp;
        }
    }
}               

此排序的操作过程为:还是以序列为(6,3,7,5,1,4,2,9)的例子来说吧。刚开始时 i = 0,假设i = 0这个位置对应的关键字是最小的,从i+1开始,在6后面的序列中找到最小的那个记录,用 k 记下第一趟排序后目前找到的最小的关键字所在的位置,判断 k 是否等于 i,不相等,说明最小值的位置发生了变化,需要交换下R[i] 和 R[k],此时序列为(1,3,7,5,6,4,2,9)。接着第二趟排序开始...以此类推,经过n - 1趟排序后,整个序列递增有序。

初始序列:6 3 7 5 1 4 2 ,排序过程如下所示:

selectionSort.png

堆排序

待续 O(∩_∩)O

相关文章

  • 续说排序

    接着上一篇文章常用的排序,继续说排序,剩下的还有直接插入排序,直接选择排序和堆排序,默认排序顺序仍是递增排序。废话...

  • 说续

    小七诗句行行真, 老叟赋词半路人。 萍水抛情莫洒尽, 二婚难领一倾心。 为夫能挺双肩任, 续室却寒后子身。 昼夜培...

  • 说续

    小七诗句行行真, 老叟赋词半路人。 萍水抛情莫洒尽, 二婚难领一倾心。 为夫能挺双肩任, 续室却寒后子身。 昼夜培...

  • 算法和数据结构2.3插入排序

    插入排序 插入排序是一种序列从左端开始一次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是...

  • 文章排序的算法续

    4.基于“冷却”规则的文章热度算法 既然说到热度,匹配自然界的冷却规律看起来应该更合理,原则有2: 1.每篇文章都...

  • 人生大事排序(续)

    原创 夏闲云 闲云醉语 前天的话题,好多朋友积极参与选择和讨论,我很高兴。感谢大家的支持! 在众多朋友们的选择中,...

  • 李安续说

    看了李安对电影的感受视频,收获了: 对 李安 这个人很神奇 也是一个积极的悲观主义者 他说: 电影有无限种可能,这...

  • 江湖说(续)

    距离荡剑八荒的日子愈来愈近,破衣男子如往常一般早起,不同的是,以往早起只是练剑,而今早不同,他认真的沐浴一...

  • 江湖说(续)

    铸剑谷少主的死,震惊了武林,而说剑榜除了三少爷之外其余几人早在几年前退隐江湖,淡出众人视野之外。一切矛头指指...

  • 续说放空

    前两天写了题为《放空》的文章,发布后还想补充一些,再下笔写写。 无聊的时候我会打开些小游戏玩耍两把,给自己换换气。...

网友评论

    本文标题:续说排序

    本文链接:https://www.haomeiwen.com/subject/vstndttx.html