跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)

选择排序(selection sort)

算法原理:有一筐苹果,先挑出最大的一个放在最后,然后再跳出一个筐里剩下的最大的一个,放在刚才跳出来的最大的前面,以此类推,最后就排好顺序了。

代码:

//从起始于位置p的n个元素中选出最大者,所以n>1
template<typename T>
ListNode<T>* List<T>::selectMax(ListNode<T>* p, int n){ ListNode<T>* max = p;
while(1 < n--){
if((p = p->succ)->data >= max->data) max = p;
} return max;
} //对从p开始的连续n个元素做选择排序,n > 1
template<typename T>
void List<T>::selectionSort(ListNode<T>* p, int n){ ListNode<T>* head = p->pred;
ListNode<T>* tail = p; for(int i = 0; i < n; ++i) tail = tail->succ; while(1 < n){
ListNode<T>* node = selectMax(head->succ, n--); //调整这个节点的前后节点
node->pred->succ = node->succ;
node->succ->pred = node->pred; //把卸下来的节点加到最后一个元素的前面
//前进线路
tail->pred->succ = node;
node->succ = tail;
//后退路线
node->pred = tail->pred;
tail->pred = node; tail = node;
}
}

插入排序(insertion sort)

算法原理:打扑克或者打麻将时,每抓一张牌后,会根据手里的牌,把抓来的这张牌,插入到适当的顺序,每抓一张牌,插入一次,全部抓完后,顺序也就排好了。

代码:

//在p的前n个前驱中,查找不大于e的最后者
template<typename T>
ListNode<T>* List<T>::search(const T& e, int n, ListNode<T>* p){ while(0 < n--){
if(p->pred->data <= e) return p->pred;
p = p->pred;
} return p;
} //对从p开始的连续n个元素做选择排序
template<typename T>
void List<T>::insertionSort(ListNode<T>* p, int n){ for(int r = 0; r < n; r++){
if(r == 0) {
p = p->succ;
continue;
}
ListNode<T>* node = search(p->data, r, p->pred);
auto tmp = p->succ; //删除p节点
p->pred->succ = p->succ;
p->succ->pred = p->pred; //在node节点后面插入p节点
p->succ = node->succ;//设定p的后驱
node->succ->pred = p;//设定p的后驱的前驱 node->succ = p;//设定p的前驱的后驱
p->pred = node;//设定p的前驱 p = tmp;
}
}

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)的更多相关文章

  1. 经典排序算法 – 插入排序Insertion sort

    经典排序算法 – 插入排序Insertion sort  插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...

  2. 排序算法--插入排序(Insertion Sort)_C#程序实现

    排序算法--插入排序(Insertion Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...

  3. 排序--选择排序Selection Sort Java实现

    基本原理 选择排序的简单原理:选择排序算法通过从未排序部分重复查找最小元素(考虑升序)并将其放在开头来对数组进行排序. 将数组两个子数组: 已排序子数组 未排序子数组 选择排序中每次循环都会从未排序子 ...

  4. 9. Sort List && Insertion Sort List (链表排序总结)

    Sort List Sort a linked list in O(n log n) time using constant space complexity.                   H ...

  5. 排序 选择排序&&堆排序

    选择排序&&堆排序 1.选择排序: 介绍:选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始 ...

  6. 排序——选择排序(java描述)

    百度百科的描述如下:选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元 ...

  7. JAVA排序--[选择排序]

    package com.array; public class Sort_Select { /** * 项目名称:选择排序 ; * 项目要求:用JAVA对数组进行排序,并运用选择排序算法; * 作者: ...

  8. C-冒泡排序,选择排序,数组

    ——构造类型 ->数组      ->一维数组      ->相同类型的一组数据      ->类型修饰符--数组名—[数组的元素个数(必须是整型表达式或者是整型常量,不能是变 ...

  9. java实现 排序算法(鸡尾酒排序&选择排序&插入排序&二分插入排序)

    1.鸡尾酒排序算法 源程序代码: package com.SuanFa; public class Cocktial {    public static void main(String[] arg ...

随机推荐

  1. 剑指offer 27:二叉搜索树与双向链表

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 解题思路 采用中序遍历遍历二叉树,利用二叉排序树的特性,顺次连接节点,形成 ...

  2. mysql 安装(Linux、Ubuntu)

    1.检查系统是否已经安装过mysql rpm -qa | grep mysql 若出现类似于以上的结果则表明系统已经安装过mysql,执行以下命令卸载 rpm -e --nodeps mysql-co ...

  3. Octave中的一些常用操作

    >> 5+6ans = 11>> 1~=2ans = 1 %1表示true,0表示false>> 1~=1    %1不等于1ans = 0>> a=2 ...

  4. 手动更新了packages.config Nuget配置文件,自动引用dll

    通过Google查询到:http://stackoverflow.com/questions/6876732/how-do-i-get-nuget-to-install-update-all-the- ...

  5. 记MacOs视频mov与mp4格式转换问题解决

    综述 记录了mov转mp4格式的方法 记录了自己是多蠢 问题背景 这学期选修的<工程英语视听说>课,需要提交一段口语考试视频,于是乎: 带着我的大疆Mavic Mini 和iPad Pro ...

  6. 用vbs和ADSI管理Windows账户

    ADSI (Active Directory Services Interface)是Microsoft新推出的一项技术,它统一了许多底层服务的编程接口,程序员可以使用一致的对象技术来访问这些底层服务 ...

  7. C#开发BIMFACE系列26 服务端API之获取模型数据11:获取单个面积分区信息

    系列目录     [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列25 服务端API之获取模型数据9:获取楼层对应面积分区列表>一文中介绍了如何获取单个模型中单个楼层包 ...

  8. 初学者用js做的计算题

    1.苹果3元一个,鸭梨2元一个,桃子1元一个.现在想用200元买100个水果,在控制台中打印出来. var apple = 0; //苹果 var pear = 0; //梨 var peach = ...

  9. python3编码问题总结

    关于python3的编码类型,到底是怎么编码的,一直使我比较疑惑,在看了网上很多帖子之后,经过自己尝试与实验,将自己的总结写在下面,一是当做一次笔记,二是希望网友们能指正.仅供参考,欢迎指正,谢谢!! ...

  10. Java 异常面试问题与解答

    Java 提供了一种健壮且面向对象的方法来处理称为 Java异常处理的异常情况. 1. Java中的异常是什么? 异常是在程序执行期间可能发生的错误事件,它会破坏其正常流程.异常可能源于各种情况,例如 ...