归并排序

JS--排序之快排和归并

时光总嘲笑我的痴心妄想 提交于 2020-03-21 22:24:46
目录 JS排序算法之快排和归并 快速排序 归并排序 JS排序算法之快排和归并 快速排序 原理: 选择一个key(一般是第一个元素), 将数组划分为两个区域. 左边全部区域小于等于key, 右边全部大于key. 然后在通过这种方法将每个区域划分为两个区域. 整个过程可以递归实现,以此实现整个数据有序 时间复杂度: O(n*log(n)) 最坏时间复杂度: O(n^2) 最坏情况: 原数组是升序(降序), 需要排成降序(升序) 不稳定的排序 特性: 数组分块,且左边区域小于右边(升序) 不稳定原因: 元素交换是跨元素直接交换, 相邻相同元素可能发生位置交换 性能: 最好的的快速排序方法 示例过程: function quickSort(ary) { let n = ary.length; function sort(ary, start, end) { if(end <= start) return; let i = start, j = end, key = ary[start]; // 设置第一个元素为key while(true) { // 从左向右找到大于key的元素位置(大于key循环停止, i就是该元素位置) while(ary[++i] < key) { // 到达末尾退出循环 if(i === end) break; } // 从右向左找到小于key的元素位置

快速排序和归并排序

♀尐吖头ヾ 提交于 2020-03-21 18:33:41
#include<iostream> using namespace std; #define ElemType int const int Maxn=105; int Partition(ElemType A[],int low,int high){ ElemType pivot=A[low]; int i=low,j=high; while(i<j){ while(i<j&&A[j]>=pivot)j--; A[i]=A[j]; while(i<j&&A[i]<=pivot)i++; A[j]=A[i]; } A[i]=pivot; return i; } void QuickSort(ElemType A[],int low,int high){ if(low<high){ int pivotPos=Partition(A,low,high); QuickSort(A,low,pivotPos-1); QuickSort(A,pivotPos+1,high); } } //时间:最好和平均O(n*log2(n)) 最坏O(n^2) //空间:最好和平均O(log2(n)) 最坏O(n) //不稳定 void Merge(ElemType A[],int low,int mid,int high){ int i,j,k; ElemType *B=new ElemType

排序算法之归并排序

大憨熊 提交于 2020-03-20 22:24:19
3 月,跳不动了?>>> 一、分治法的思想 把复杂的问题分解,再分解,成为很小的问题,解决这些小问题之后合并,再合并。这就是分治法的思想。 通常分治法是递归的。 二、归并排序 归并排序就是利用分治法,把无序的数列拆分成多个子数列,子数列再拆分成多个子数列,直至只子数列只有2个数,然后排序,合并,再排序,在合并。。。直到只剩一个有序的数列。 归并排序算法的核心就是:两个各自有序的数列合并成一个完全有序的数列。这个过程可以说很简单,就是从两个数列开头选出最小的数,放入第三个数列中,然后较小的数的指标后移,继续重复操作。直到其中一个数列全部被放入队列中,此时另一个队列剩下的全部数放入第三个数列。 归并排序的时间复杂度是O(nlgn) 如图所示: 三、Java代码实现 public class MergeSort { public static void main(String[] args) { int a[] = {5,3,2,8,7,6,10,20,30,11,22,33,44,100,60,200}; mergeSort(a, 0, a.length - 1); for (int i : a) { System.out.println(i); } } //递归拆分数列 public static void mergeSort(int[] a, int low, int high)

归并排序

自古美人都是妖i 提交于 2020-03-20 22:08:50
3 月,跳不动了?>>> 1、思想 也是分治思想,利用递归和分治技术将数据序列划分为越来越小的半子集,对半子集排序,再用递归方法将排好序的半子集合并为大的有序序列。 2、时间复杂度 最好 O(nlogn) ,最坏 O(nlogn),平均O(nlogn)。 3、代码实现 public class mergeSort { public static void MergeSort(int[] arr){ Sort(arr, 0, arr.length-1); } private static void Sort(int[] arr, int left, int right) { if(left < right){ int mid = (left + right)/2; Sort(arr, left, mid); Sort(arr, mid+1,right); Merge(arr, left, mid, right); } } private static void Merge(int[] arr, int left, int mid, int right) { int[] temparr = new int[arr.length]; int thrif = left; int center = mid+1; int temp = left; while (left <= mid &&

PAT-乙级-1035. *插入与归并(25)

纵饮孤独 提交于 2020-03-20 18:23:26
1035. 插入与归并(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 根据维基百科的定义: 插入排序 是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。 归并排序 进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。 输出格式: 首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。 输入样例1: 10 3 1 2 8 7 5 9 4 6 0 1 2 3 7 8 5 9 4 6 0 输出样例1: Insertion Sort 1 2 3 5 7 8 9 4 6 0 输入样例2: 10

排序--归并排序MergeSort(Java实现)

最后都变了- 提交于 2020-03-19 19:44:35
原理简述 归并排序的基本思想是 分治 ,基本原理就是将原数组分为两部分,然后再将分开的数组在进行合并。 图解 代码 public class MergeSort { /** * 合并 * @param arr 排序数组 * @param start 开始索引 * @param m 中间位置索引 * @param end 结束索引 */ static void merge(int[] arr,int start,int m,int end){ //分别计算两个分组的长度 int n1 = m - start + 1; int n2 = end - m; //创建两个辅助数组 int[] L = new int[n1]; int[] R = new int[n2]; //将原数组的元素拷贝到辅助数组中 for (int i = 0; i < n1; i++) { L[i] = arr[start + i]; } for (int j = 0; j < n2; j++) { R[j] = arr[m+1+j]; } //遍历两个数组,当其中任意一个数组遍历完毕的时候停止循环 int i = 0,j = 0; int k = start; while (i<n1 && j<n2){ if (L[i]<=R[j]){ //当遍历到的左边数组元素小于等于遍历到右边的数组

插入排序和归并排序

眉间皱痕 提交于 2020-03-19 06:57:46
插入排序思想:在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使这n个数也是排好顺序的。如此反复循环,直到全部排好顺序.(当待排序数据全部有序时,时间复杂度为O(N),最坏情况下时间复杂度为O(N*N),与待排序数据的状态有关). public class InsertSort { public static void insertSort(int[] arr) { if(arr == null || arr.length < 2) return ; for(int i = 1; i < arr.length; i++) { for(int j = i -1; j >= 0 && arr[j] > arr[j+1]; j--) swap(arr, j , j+1); } } public static void swap(int[] arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } public static void main(String[] args) { int[] arr = new int[] {3,434,24,656,57,54,88,66}; System.out.print("原始数组:"); for(int i = 0; i <

归并排序(JS代码)

不羁岁月 提交于 2020-03-16 12:29:46
归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。 如 设有数列{6,202,100,301,38,8,1} 初始状态:6,202,100,301,38,8,1 第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3; 第二次归并后:{6,100,202,301},{1,8,38},比较次数:4; 第三次归并后:{1,6,8,38,100,202,301},比较次数:4; 该算法采用经典的 分治 主要操作步骤: 1:把长度为n的输入序列分成两个长度为n/2的子序列; 2:对这两个子序列分别采用归并排序; 3:将两个排序好的子序列合并成一个最终的排序序列。 Array.prototype.mergeSort = function() { let merge = function(left, right) { let resArr = [] while(left.length && right.length) { // 这里shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。 if(left[0] < right[0]) { resArr.push(left.shift()) }else { resArr.push(right.shift()) } } return resArr.concat

归并排序(Merge Sort)

江枫思渺然 提交于 2020-03-14 22:16:41
算法描述 归并操作的过程如下: 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 设定两个指针,最初位置分别为两个已经排序序列的起始位置 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 重复步骤3直到某一指针达到序列尾 将另一序列剩下的所有元素直接复制到合并序列尾 示例代码 #include<iostream> using namespace std; int data[8]={1,2,3,4,1,9,6,8}; int merge(int unSorted[],int sorted[],int first,int mid,int last){ int fpoint=first; int spoint=mid+1; int sortedPoint=first; while(fpoint<=mid && spoint<=last){ if(unSorted[fpoint]<unSorted[spoint]) sorted[sortedPoint++]=unSorted[fpoint++]; else sorted[sortedPoint++]=unSorted[spoint++]; } if(fpoint>mid) while(sortedPoint<=last) sorted[sortedPoint++]=unSorted

数据结构与算法之比较排序算法总结

喜欢而已 提交于 2020-03-13 14:53:32
介绍: 比较算法大致可以分为两种,一种为比较算法,另一种为非比较算法。 比较算法有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序,希尔排序。 非比较算法有:计数排序,基数排序,桶排序。 https://gitee.com/linqiankun/Utils/tree/v3.0/ 时间复杂度: 排序方法 最好情况 平均情况 最差情况 辅助空间 稳定性 冒泡排序 n n^2 n^2 1 yes 选择排序 n^2 n^2 n^2 1 no 插入排序 n n^2 n^2 1 yes 归并排序 nlogn nlogn nlogn n yes 堆排序 nlogn nlogn nlogn 1 no 快速排序 nlogn nlogn n^2 1 no 希尔排序 n^1.3 nlogn~n^2 n^2 logn~n no 比较算法: 冒泡排序 普通冒泡排序 冒泡排序是一种极为简单的排序算法。通过循环反复的遍历数组中的元素,依次比较相邻的两个元素。如果不满足排序规则,就进行位置交换,直到没有元素需要交换位置,排序完成。 这个算法会慢慢的使元素按照需要的顺序浮出来。 时间复杂度为:O(n)~O(n^2)~O(n^2) 冒泡排序运行顺序: 比较相邻元素,按照排序规则进行位置交换。 对每一对相邻元素进行第一步的操作,操作完之后,队伍最后会是满足条件的数。循环体的内层循环走完一圈。