跳跃空间(链表)排序 选择排序(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 ...
随机推荐
- Mac OS 自带apache 启动不了的问题
问题:Mac OS 自带apache,启动不了,拒绝访问. 1.先看一下错误日志 /etc/apache2/httpd.conf 2.然后我去找了一下/private/var/log/apache2/ ...
- CSAPP 3 程序的机器级表示
1 本章总述 1) 通过让编译器产生机器级程序的汇编表示, 学习了编译器及其优化能力, 以及机器.数据类型和指令集; 2) 学习了程序如何将数据存储在不同的内存区域中 -- 程序开发人员需要知道一个变 ...
- 41-data-packed volume container
在上一节的例子中 volume container 的数据归根到底还是在 host 里,有没有办法将数据完全放到 volume container 中,同时又能与其他容器共享呢? 当然可以,通常我们称 ...
- 浅谈Django基础(HttpResponse、render、redirect)
1. 使用之前先导入他们 from django.shortcuts import HttpResponse, render, redirect 2. HttpResponse: 它是作用是内部传入一 ...
- gcc 4.9 编译安装 in Ubuntu 18.04(主要用于在无root权限下,进行更新系统 gcc 版本)
gcc 4.9 编译安装教程,因为项目编译过程中,需要采用特定的gcc版本来进行编译,所以进行简要记录,进行备忘: 下载:curl -O -L https://mirrors.tuna.tsinghu ...
- 实际场景:UI、原型与实际不符;研发怼你,你要怎么办?-Dotest软件测试
实际公司场景:UI.原型与实际不符:你提交的问题(bug),开发又开始怼你,遇到这种情况,你会怎么办?怎么沟通?(如下图) 解释:大部分公司都是这样,区别在于差异性有多大:做出来的东西大部分与设计.原 ...
- VMWare ESX server安装
和装普通虚拟机是一样的 需要添加两块网卡. F11同意协议 直接回车即可‘ 选择字符集 输入密码 按F11安装系统 按回车键重启 按F2 配置网络管理 启用两块网卡,按回车确定 配置IPV4地址 用空 ...
- cookie和session及token的区别联系
1 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我 ...
- (day67)作业
有以下广告数据(实际数据命名可以略做调整) ad_data = { tv: [ {img: 'img/tv/001.png', title: 'tv1'}, {img: 'img/tv/002.png ...
- React: React脚手架
一.简言 React开发目前已经非常流行,对于如何实现对React项目的管理和维护,React生态圈出现了大量可用的开发工具,例如Browserify.Gulp.Grunt.webpack等.其中,w ...