跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)
跳跃空间(链表)排序 选择排序(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)的更多相关文章
- 经典排序算法 – 插入排序Insertion sort
经典排序算法 – 插入排序Insertion sort 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...
- 排序算法--插入排序(Insertion Sort)_C#程序实现
排序算法--插入排序(Insertion Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...
- 排序--选择排序Selection Sort Java实现
基本原理 选择排序的简单原理:选择排序算法通过从未排序部分重复查找最小元素(考虑升序)并将其放在开头来对数组进行排序. 将数组两个子数组: 已排序子数组 未排序子数组 选择排序中每次循环都会从未排序子 ...
- 9. Sort List && Insertion Sort List (链表排序总结)
Sort List Sort a linked list in O(n log n) time using constant space complexity. H ...
- 排序 选择排序&&堆排序
选择排序&&堆排序 1.选择排序: 介绍:选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始 ...
- 排序——选择排序(java描述)
百度百科的描述如下:选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元 ...
- JAVA排序--[选择排序]
package com.array; public class Sort_Select { /** * 项目名称:选择排序 ; * 项目要求:用JAVA对数组进行排序,并运用选择排序算法; * 作者: ...
- C-冒泡排序,选择排序,数组
——构造类型 ->数组 ->一维数组 ->相同类型的一组数据 ->类型修饰符--数组名—[数组的元素个数(必须是整型表达式或者是整型常量,不能是变 ...
- java实现 排序算法(鸡尾酒排序&选择排序&插入排序&二分插入排序)
1.鸡尾酒排序算法 源程序代码: package com.SuanFa; public class Cocktial { public static void main(String[] arg ...
随机推荐
- vue中使用props传递参数
通常,父组件的模板中包含子组件,父组件要正向地向子组件传递数据或参数,子组件收到后根据参数的不同来渲染不同的内容,或者执行操作. 这个正向传递数据的过程是通过props来实现的. 在组件中,子组件使用 ...
- UIPageControl页面控制的控件
#import "ViewController.h" #import "LazyScrollView.h" @interface ViewController ...
- Django用websocket实现聊天室之筑基篇
最近闲来无事,无意发现一个聊天室的前端UI,看着挺好看的但是没有聊天室的通信代码,于是想给它安装电池(通信部分),先看UI: 开始通信部分的工作: 使用的组件: Django1.11.13 chann ...
- tomcat9启动后控制台输出乱码问题
修改Tomcat9下 /conf/logging.properties 文件 找到java.util.logging.ConsoleHandler.encoding=utf-8 改成GBK 或者注释掉
- django之查询操作及开启事务
目录 聚合查询 aggregate 聚合函数 分组查询 annotate F与Q查询 F查询 Q查询 ORM操作事务 django中开启事务 聚合查询 aggregate 操作外键字段管理数据的时候, ...
- JVM-9-调优工具
JDK的bin目录下有很多用于监视虚拟机和故障处理的工具,这些工具都非常稳定而且功能强大,能在处理应用程序性能问题.定位故障是发挥很大的作用.比较细心的读者可能会注意到这些工具的程序体积都异常小巧.并 ...
- VIJOS-P1013 强墙
JDOJ 1198: VIJOS-P1013 强墙 JDOJ传送门 Description 在一个长宽均为10,入口出口分别为(0,5).(10,5)的房间里,有几堵墙,每堵墙上有两个缺口,求入口 ...
- LG5196 「USACO2019JAN」Cow Poetry 背包+乘法原理
\(\mathrm{Cow Poetry}\) 问题描述 LG5196 题解 因为每句诗的长度一定是\(k\),所以自然而然想到背包. 设\(opt[i][j]\)代表到第\(i\)位时,结尾为\(j ...
- golang数据结构之选择排序
//SelectSort 选择排序 func SelectSort(arr *[]int) { ; i < len(arr); i++ { tmp := arr[i] index := i ; ...
- 源码学习之Spring (系统架构简单解析)
Spring Framework 系统架构总览图 Spring Framework的模块依赖关系图 Spring Framework各个模块功能说明 Spring核心模块 模块名称 主要功能 Spri ...