链表快排 & 基于链表的排序】的更多相关文章

以前只知道链表做插入(朴素.非二分)排序挺方便的.现在知道了(单)链表进行快速排序也是很好的(只是跟一般的快排的方式不一样). 参考: http://blog.csdn.net/otuhacker/article/details/10366563 我们只需要两个指针p和q,这两个指针均往next方向移动,移动的过程中保持p之前的key都小于选定的key,p和q之间的key都大于选定的key,那么当q走到末尾的时候便完成了一次支点的寻找.如下图所示:…
题目来源.待字闺中.原创@陈利人 .欢迎大家继续关注微信公众账号"待字闺中" 分析:思路和数据的高速排序一样,都须要找到一个pivot元素.或者节点. 然后将数组或者单向链表划分为两个部分.然后递归分别快排. 针对数组进行快排的时候,交换交换不同位置的数值.在分而治之完毕之后,数据就是排序好的.那么单向链表是什么样的情况呢?除了交换节点值之外.是否有其它更好的方法呢?能够改动指针,不进行数值交换.这能够获取更高的效率. 在改动指针的过程中.会产生新的头指针以及尾指针,要记录下来.在pa…
给出N个整数,对着N个整数进行排序   Input 第1行:整数的数量N(1 <= N <= 50000) 第2 - N + 1行:待排序的整数(-10^9 <= A[i] <= 10^9) Output 共n行,按照递增序输出排序好的数据. Input示例 5 5 4 3 2 1 Output示例 1 2 3 4 5解:快速排序,两边同时比较.交换. #include <stdio.h> #include <stdlib.h> ]; void swap(i…
C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). 5.链表反转(普通方法.递归方法). 6.链表合并. 7.获取链表中间节点. 8.判断链表是否有环. LinkList.h : #include <stdio.h> #include <stdlib.h> struct LinkNode { int data; struct LinkN…
插入排序 import java.util.Arrays; public class InsertionSort { /** * 对数组里面进行插入排序 * 参数1 数组 * 参数2 数组大小 */ static void InsertSort(int arr[]){ int in,out,temp; for ( out = 1; out < arr.length; out++) { temp = arr[out]; in=out; while (in>0 && arr[in-…
一.基本的快速排序 在数组中选取一个元素为基点,然后想办法把这个基点元素移动到它在排好序后的最终位置,使得新数组中在这个基点之前的元素都小于这个基点,而之后的元素都大于这个基点,然后再对前后两部分数组快速排序,直到数组排序完成. 代码实现: public void quickSorted ( int arr[] ) { int n = arr.length - 1; // 闭区间 [0...n] __quickSorted (arr, 0, n); } private __quickSorted…
上篇文章中我们好好地学习了一下插入类相关的两个排序,不过,和交换类的排序对比的话,它们真的只是弟弟.甚至可以说,在所有的排序算法中,最出名的两个排序都在今天要介绍的交换排序中了.不管是冒泡.还是快排,都是面试中的常见排序算法,常见到什么地步呢?但凡学习数据结构和算法,甚至是你完全没有学习过,也多少都会听说过这两个排序算法.而一些大中型公司更是直接在面试题中指明不要使用这两种算法来实现一些排序的题目,这又是为什么呢?那当然也是因为这两个算法实在是太出名了,很多人都随便就能手写出来. 当然,不管你面…
#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student //结构体声明 { long num; int score; struct Student* next; }; int n; struct Student* creat() //创建单向链表 { struct Student *head=NULL, *p_before, *p_later; p_before =…
[本文链接] http://www.cnblogs.com/hellogiser/p/quick-sort-of-array-and-linked-list.html [题目] 单链表的特点是:单向.设头结点位head,则最后一个节点的next指向NULL.如果只知道头结点head,请问怎么将该链表排序? [分析] 对于数组的快排:有2种方式. (1)指针相向移动:一个指针i指向头,一个指针j指向尾,然后两个指针相向运动并按一定规律交换值,最后找到一个支点p使得支点左边的值小于支点,支点右边的值…
链表文件 package sort; public class SqList {    public int LIST_INIT_SIZE = 8;//链表的原始大小    private int INCREMENT = 1;//链表的增量大小    private Object[] SqList = null;//链表    private int curIndex = 0;//当前位置     /**     * 初始化链表     * */    public void initList(…
本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} , , , , , , , , ,  }; public static void insertSort() { int tmp, j = ; for…
说明 本文基于链表实现C语言堆内存的检测机制,可检测内存泄露.越界和重复释放等操作问题. 本文仅提供即视代码层面的检测机制,不考虑编译链接级的注入或钩子.此外,该机制暂未考虑并发保护. 相关性文章参见: <C语言通用双向循环链表操作函数集> <C语言内存使用的常见问题及解决之道> 一  原理 堆内存泄漏检测机制的基本原理是截获对内存分配和释放函数的调用,从而跟踪每块内存的生命周期.例如,每次成功分配一块内存后,将内存分配信息(如指向它的指针.文件名.函数名.行号和申请字节数等)加入…
//链表的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> //定义链表结构体 struct LinkCode{ int num; ]; struct LinkCode * linknext; }; //静态链表 void Linkone(){ struct LinkCode n1, n2, n3, n4, n5; struct LinkC…
/*=================================================================== 1076 排序 题目描述 Description 给出n和n个整数,希望你从小到大给他们排序 输入描述 Input Description 第一行一个正整数n 第二行n个用空格隔开的整数 输出描述 Output Description 输出仅一行,从小到大输出n个用空格隔开的整数 样例输入 Sample Input 3 3 1 2 样例输出 Sample O…
Problem Description Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. Input 测试输入包含若干测试用例.每个测试用例的第1行包含两个整数 N (<=100000) 和 C,其中 N 是纪录的条数,C 是指定排序的列号.以下有 N 行,每行包含一条学生纪录.每条学生纪录由学号(6位数字,同组测试中没有重复的学号).姓名(不超过8位且不包含空格的字符串).成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开.当读到 N=0 时,全部输入结…
很多时候排序是为了对数据进行归类,这种排序重复值特别多 通过年龄统计人口 删除邮件列表里的重复邮件 通过大学对求职者进行排序 若使用普通的快排对重复数据进行排序,会造成N^2复杂度,但是归并排序和三路快排就没有这样的问题. 归并排序对重复数据排序的比较在1/2NlgN和NlgN之间 三路快排 目标:将数据分成三个区间(3-way partitioning) lt和gt区间内的元素都和比较元素v相等 lt左边的元素都比v小 gt右边的元素都比v大 性能 三路快排的复杂度比普通快排小,主要取决于数据…
C标准库qsort()函数的用法(快排) 使用快速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base, int  nelem, int  width, int (*fcmp)(const void*,const void *)); 参数: 1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序 其中comp函数应写为: int comp ( const void *a, const void…
 题目 基于链表的队列实现 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <malloc.h> #include<assert.h> typedef struct QNode { int nValue; struct QNode *pNext; }QNode, *PQNode; typedef struct { PQNode pHead;…
俗话说:天下武功无坚不破,唯快不破.对于算法当然也是要使用时间最短.占用空间最小的算法来实现了. 注意:我代码里面打的备注仅供参考,建议不要背模板(因为没有固定的模板),可以写一个数列按着代码跑两圈或者把代码改一下输出每次排序后的结果. 总之,师傅领进门,修行在个人.奋斗把!骚年! ※冒泡排序.选择排序:(不稳定,时间复杂度 O(n^2)) #include "cstdio" #include "iostream" using namespace std; void…
一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法. 二.划分: 划分是快速排序的前提,即把数据分为两组,大于特定值的数据在一组,小于特定值的数据在另一组.快速排序即是由划分和递归操作来完成的. (1)原理: 定义一个阈值,分别从最左面和最右面向中间遍历元素,左面找到一个大于阈值的数据便停止,右边找到一个小于阈值的数据便停止,如果此时左右两边都还没…
在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使用单链表实现一个简单版的队列.单向链表队列是属于非循环队列,同时队列的长度是不受限制的,也就是说添加数据的速度比拉取数据的速度快时,队列的长度是无限增长的.单链队列其本质就是一个链表,只不过是在获取或添加数据的时候跟普通的链表有所区别,队列在获取数据的同时也将该节点删除,并且每次获取数据都是从表头获…
javascript高级排序算法之快速排序(快排)我们之前讨论了javascript基本排序算法 冒泡排序 选择排序 插入排序 简单复习: 冒泡排序: 比较相邻的两个元素,如果前一个比后一个大,则交换位置. 第一轮的时候最后一个元素应该是最大的一个. 按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以最后一个元素不用比较. 选择排序:首先从原始数组中找到最小的元素,并把该元素放在数组的最前面,然后再从剩下的元素中寻找最小的元素,放在之前最小元素的后面,直到排序完…
1.阻塞队列的原理 阻塞队列与普通队列的区别在于:阻塞队列为空时,从队列中获取元素的操作将会被阻塞,当队列为满时,往队列里添加元素的操作会被阻塞. 试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素.同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来 2.阻塞队列的简单实现 /** * 基于链表实现的一个阻塞队列 * * @author jade * */ public class BlockingQueue { pr…
在6.1中我们实现了底层基于二叉搜索树的集合,本节就底层如何基于链表实现进行学习,注意:此处的链表是之前自己封装的. 1.集合set相关功能 1.1 add()的不同 用于链表本身没有去重的效果,因此我们在做基于链表的集合时,需要对add()方法做一下特殊处理,如下增加一个判断即可. @Override public void add(E e) { if (!list.contains(e)) { list.addFirst(e); } } 2.集合实现 2.1 Set接口定义 /** * 集合…
问题:给n个整数,按从大到小的顺序,输出前m大的整数0<m,n<1000000,每个整数[-500000,500000]输入:5 33 -35 92 213 -644输出:213 92 3 思路:先按从小到大用快排排好序,然后输出排好序的数组从最后开始输出m个即可关键:1 已经达到千万数量级,1秒不能解决,必须用哈希,因为数字的范围达到百万级2 哈希针对的是输入数值处于特定范围的问题,建立一个范围大小的数组,建立hash[x] = x出现多少次的映射3 对于定义较大容量的数组,放在函数体外,这…
算法是解决一类问题的方法排序算法 根据元素大小关系排序 从小到大 从大到小冒泡 选择 插入 快排希尔排序 归并排序 堆排序 冒泡排序 从头到尾比较 每一轮将最大的数沉底 或者最小数字上浮 选择排序 1.找到最小/大的数字放到最前面 2.除过第一个数字以外,找到最小/大的数字与第二个元素对换 每一轮只交换一次数字 插入排序假如 1 2 5 9 0(1)现在1是有序的 选择5 和1比较,大了放1前面小了放1后面后面的元素一个个插入到前面的队列中 插入保证有序最后插入完成之后 这个元素的序列也是有序的…
快排 Array.prototype.fastSort = function(){ var arr = this; function sort(left, right, arr){ if( left >= right){ return; } var key = arr[left]; var i = left; var j = right; while(i < j){ while(i < j && arr[j] >= key){ j--; } arr[i] = arr…
一.快排的一种 ==================== public class myMain { public static void main(String[] args) { int t[] = {2,6,7,8,5,4},low,high; low = 0; high = t.length-1; allSort(t,low,high); for(int t1:t){ System.out.print(t1); } } public static void allSort(int[] t…
//堆排序 不稳定 import java.util.Arrays; public class HeapSort { public static void main(String[] args) { int[] a={49,38,65,97,76,13,27,49,78,34,12,64}; int arrayLength=a.length; //循环建堆 for(int i=0;i<arrayLength-1;i++){ //建堆 buildMaxHeap(a,arrayLength-1-i)…
学习数据结构的时候遇到一个经典的回文链表问题 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构. 如果有链表反转的基础,实现链表回文判断就简单的多,如果对反转链表不熟悉,可以参考这篇博客. 思路很简单,先找到链表的中间Node,采用的快慢指针法. 慢指针一次走一步,快指针一次走两步,当快指针触底的时候,慢指针到达了重点,如果链表总数是偶数,则慢指针停在相对左边的Node上. 找到中点后,对中点后面的链表进行反转. 从头尾开始向中间移步,每次比较是…