归并排序

Ultra-QuickSort(poj 2299归并排序)

两盒软妹~` 提交于 2020-01-05 03:12:29
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=232#problem/A B - Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status Description In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence 9 1 0 5 4 , Ultra-QuickSort produces the output 0 1 4 5 9 . Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a

快速排序和归并排序

走远了吗. 提交于 2020-01-03 05:24:41
1,快速排序 快速排序通过分割值列,然后递归的对两个部分进行排序,从而实现对值列的排序。它的基本思想是:通过一趟排序将要排序的 数据分割 成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序 首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序 。 怎么实现呢?--- 它的关键在于完成一趟快排后,基准元素在哪个位置,每次都选取一个分割列的第一个元素作为基准元素,来寻找用它来分割排序列后它自己所处的位置,编写一个 int findPartition(data,min,max)方法,用于 使用data[min]作为基准元素把data[min]到data[max]分割为两个部分,并返回分割以后基准元素自己所在的位置索引。 在主函数里这样来调用: public static void quickSort(Comparable[] data,int min,int max) { int mid; if(min < max) { mid = findPartition(data,min,max); quickSort(data,min,mid-1); quickSort(data,mid+1,max); } } 理解递归过程:::if(min <

C/C++版数据结构之排序算法

柔情痞子 提交于 2020-01-03 05:17:59
今天讨论下数据结构中的排序算法。 排序算法的相关知识: (1)排序的概念:所谓排序就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。 (2)稳定的排序方法:在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的。相反,如果发生改变,这种排序方法不稳定。 (3)排序算法的分类(分为5类):插入排序、选择排序、交换排序、归并排序和分配排序。 (4)排序算法两个基本操作:<1>比较关键字的大小。 <2>改变指向记录的指针或移动记录本身。 具体的排序方法: 插入排序 <1>插入排序(Insertion Sort)的思想:每次将一个待排序的记录按其关键字大小插入到前面已经排好序的子记录中的适当位置,直到全部记录插入完成为止。 <2>常用的插入排序方法有直接插入排序和希尔排序。 (1)直接插入排序 <1>算法思路:把一个记录集(如一个数组)分成两部分,前半部分是有序区,后半部分是无序区;有序区一开始有一个元素r[0],无序区一开始是从r[1]到之后的所有元素;然后每次从无序区按顺序取一个元素r[i],拿到有序区中由后往前进行比较,每次比较时,有序区中比r[i]大的元素就往后移动一位,直到找到小于r[i]的元素,这时r[i]插到小元素的后面,则完成一趟直接插入排序。如此反复,从无序区不断取元素插入到有序区

常见排序算法

旧巷老猫 提交于 2020-01-03 05:04:42
索引 1. 插入排序 1.1 直接插入 1.2 折半插入 1.3 希尔排序 2. 交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择排序 3.1 直接选择 3.2 堆排序 4. 归并排序 4.1 迭代归并 总结 1. 插入排序 思想 :每步将一个待排序的对象, 按其排序码大小, 插入到前面已经排好序的一组对象的适当位置上, 直到对象全部插入为止。 1.1 直接插入 1.1.1 方法: 当插入第i (i >= 1) 个对象时, 前面的V[0], V[1], …, V[i-1]已经排好序。这时, 用V[i]的排序码依次与V[i-1], V[i-2], …的排序码顺序进行比较, 找到插入位置即将V[i]插入, 原来位置上的对象向后顺移。 具体过程: 1. 把n个待排序的元素看成为一个“有序表”和一个“无序表”; 2. 开始时“有序表”中只包含1个元素,“无序表”中包含有n-1个元素; 3. 排序过程中每次从“无序表”中取出第一个元素,依次与“有序表”元素的关键字进行比较,将该元素插入到“有序表”中的适当位置,有序表个数增加1,直到“有序表”包括所有元素。 1.1.2 实例图: 1.1.3 代码: /** * 直接插入排序:将数组从小到大排序 */ #include <iostream> using namespace std; typedef int Index;//下标的别名

排序算法汇总

删除回忆录丶 提交于 2020-01-03 05:02:57
1.排序算法简要比较 名称 数据对象 稳定性 时间复杂度 空间复杂度 描述 平均 最坏 插入排序 数组、链表 √ O(1) (有序区,无序区)。把无序区的第一个元素插入到有序区的合适的位置。对数组:比较得少,换得多。 直接选择排序 数组 × O(1) (有序区,无序区)。在无序区里找一个最小的元素跟在有序区的后面。 对数组:比较得多,换得少。 链表 √ 堆排序 数组 × O(nlogn) O(1) (最大堆,有序区)。从堆顶把根卸出来放在有序区之前,再恢复堆。 归并排序 数组、链表 √ O(nlogn) O(n) +O(logn) , 如果不是从下到上 把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。可从上到下或从下到上进行。 快速排序 数组 × O(nlogn) O(logn) ,O(n) (小数,枢纽元,大数)。 Accum qsort 链表 √ O(nlogn) O(logn) ,O(n) (无序区,有序区)。把无序区分为(小数,枢纽元,大数),从后到前压入有序区。 决策树排序 √ O(logn!) O(n!) O(n) <O(logn!) <O(nlogn) 计数排序 数组、链表 √ O(n) O(n+m) 统计小于等于该元素值的元素的个数 i,于是该元素就放在目标数组的索引 i位。(i≥0) 桶排序 数组、链表 √ O(n) O(m) 将值为 i 的元素放入i

面试准备(算法部分)

断了今生、忘了曾经 提交于 2020-01-03 04:58:40
No.1 冒泡排序 冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以从左往右冒泡,也可以从右往左冒泡,看心情),依次比较相邻的两个数的大小(到底是比大还是比小也看你心情)。 冒泡排序动图演示 图解冒泡排序 以 [ 8,2,5,9,7 ] 这组数字来做示例,上图来战: 从左往右依次冒泡,将小的往右移动 冒泡排序1 首先比较第一个数和第二个数的大小,我们发现 2 比 8 要小,那么保持原位,不做改动。位置还是 8,2,5,9,7 。 指针往右移动一格,接着比较: 冒泡排序2 比较第二个数和第三个数的大小,发现 2 比 5 要小,所以位置交换,交换后数组更新为:[ 8,5,2,9,7 ]。 指针再往右移动一格,继续比较: 冒泡排序3 比较第三个数和第四个数的大小,发现 2 比 9 要小,所以位置交换,交换后数组更新为:[ 8,5,9,2,7 ] 同样,指针再往右移动,继续比较: 冒泡排序4 比较第 4 个数和第 5 个数的大小,发现 2 比 7 要小,所以位置交换,交换后数组更新为:[ 8,5,9,7,2 ] 下一步,指针再往右移动,发现已经到底了,则本轮冒泡结束,处于最右边的 2 就是已经排好序的数字。 通过这一轮不断的对比交换,数组中最小的数字移动到了最右边。 接下来继续第二轮冒泡: 冒泡排序5 冒泡排序6 冒泡排序7 由于右边的 2 已经是排好序的数字

排序算法之归并排序

你离开我真会死。 提交于 2019-12-28 23:36:43
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> #include <iostream> using namespace std; //归并算法 /** 一句箴言:将待排序数据一分为二,二分为四,四分为八,递归下去,直至每份为1个元素,这一个元素自身一定为有序的,然后再将分了的两两合并为有序数组,最终变成一个有序数组。 方法:递归拆分并两两合并为有序数组。其中合并时候需要将待合并的两组数据拷贝出来,指定左待归并数据索引i,右待归并数据索引j, k为原数组需重新指定值得索引 **/ void _merge(int arr[], int l, int mid, int r) { //归并前判断是否分割的两数组已经左边小右边大了 if (arr[mid+1] > arr[mid]) { return; } //首先需要拷贝出待归并区间的数据 区间为索引l到 r int aux[r - l + 1]; for (int i = l ; i <= r; i++) { aux[i - l] = arr[i]; } /** // 注释的是去除掉偏移量l后的数组 求解法 int max = r -l; int newMid = (max - min) / 2; int i = 0,j = newMid + 1; //遍历原数组l到 r 这个区间

归并排序

那年仲夏 提交于 2019-12-28 15:46:59
归并排序 归并排序简介 并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 思路分析 将要排序的数据对半分 意为左边的数据和右边的数据 重复第一步操作直到只有一个数 将左边的数据和右边的数据进行排序 代码再现 public class MergeSort { public static void sort ( int [ ] data ) { assert data != null ? true : false ; int len = data . length ; mergeSort ( data , 0 , len - 1 ) ; } public static void mergeSort ( int [ ] data , int begin , int end ) { if ( begin < end ) { //起始点 小于 结束点 int mid = ( end + begin ) / 2 ; mergeSort ( data , begin , mid ) ; mergeSort ( data , mid + 1 , end ) ; merge ( data , begin , mid

归并排序的分析与Java实现

邮差的信 提交于 2019-12-28 04:06:39
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。 归并排序算法依赖归并操作。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 归并排序在众多排序算法中既是稳定排序,效率也比较高,同时,归并排序不仅可以用于内排序,还可以用于外排序。 1.两个有序数列的合并 设两个有序数列放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到一个局部的暂存向量 R1中,待合并完成后将 R1 复制回 R[low..high]中。 (1)合并过程 合并过程中,设置 i,j 和 p 三个指针,其初值分别指向这三个记录区的起始位置。 合并时依次比较 R[i]和 R[j]的关键字,取关键字较小的记录复制到 R1[p]中,然后将被复制记录的指针 i 或 j 加 1,以及指向复制位置的指针 p 加 1。 重复这一过程直至两个输入的子文件有一个已全部复制完毕,此时将另一非空的子文件中剩余记录依次复制到 R1 中即可。 (2)动态申请 R1 实现时,R1 是动态申请的,因为申请的空间可能很大,所以在工程上应用时,可能需要加入申请空间是否成功的处理。 2.归并排序的实现 (1)二路归并的思路 将数组划均分为两个子数组; 对两个字数组进行排序; 将排序好的两个字数组归并。 所谓 N路归并 是指将数组均分为N个子数组

我的Java开发学习之旅------>Java经典排序算法之归并排序

非 Y 不嫁゛ 提交于 2019-12-28 04:06:24
一、归并排序 归并 排序 是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路 归并 。 归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。 二、 归并操作 三、两路归并算法 1、算法基本思路  设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到一个局部的暂存向量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中。 (1)合并过程  合并过程中,设置i,j和p三个指针,其初值分别指向这三个记录区的起始位置。合并时依次比较R[i]和R[j]的关键字