之前看到一个题目,大概是:有一个长度为n的数组,数组内的元素取值范围为0到m,且不相等,要求元素经过n次移动后使数组有序(即算法的复杂度为O(n))。看到题目后想了快速排序和归并排序发现并不能满足题目要求,直到有次看书有看到了桶排序然后豁然开朗,所以决定把这些排序算法再写一遍,加深记忆。约定:之后的...
分类:
其他好文 时间:
2014-05-09 10:52:49
阅读次数:
333
归并排序原理:
归并排序用到的是分治思想,即把一个大问题分成两个小问题,然后把一个小问题再分为两个更小的小问题,从最小的问题开始解决,然后把小问题的结果进行整合,最终解决大问题,这种思想是自顶向下的方法,特点是先进行递归,最终进行排序,在之后的快速排序中可以看到,快速排序特点是先进行排序,后进行递归...
分类:
其他好文 时间:
2014-05-09 06:15:26
阅读次数:
280
为什么归并排序如此有用?1.
快捷和稳定归并排序成为?一个非常棒的排序算法主要是因为它的快捷和稳定。它的复杂度即使在最差情况下都是O(n log
n)。而快速排序在最差情况下的复杂度是O(n^2),当n=20的时候,它比归并要慢4.6倍。2.容易实现#coding:utf-8def merge_so...
分类:
编程语言 时间:
2014-05-09 03:44:58
阅读次数:
386
归并排序的基本思想:首先,将R[0..n-1]看成是n个长度为1的有序表,将相邻的有序表进行归并,得到n/2个长度为2的有序表;然后,再将这些有序表成对归并,得到n/4个长度为4的有序表,如此循环下去,最后得到一个长度为n的有序表。
注意的是:Merge()实现了一次归并,接下来需要利用Mer...
分类:
其他好文 时间:
2014-05-08 14:28:05
阅读次数:
484
快速排序是一种分治的排序。快速排序与归并排序是互补的:
归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;而快速排序将数组首先切分成两个子串,然后分别排序。相关的代码:public
static void QuickSort(char[] a, int lo, int hi...
分类:
其他好文 时间:
2014-05-07 14:14:01
阅读次数:
264
归并排序
归并排序 (merge sort) 是一类与插入排序、交换排序、选择排序不同的另一种排序方法。归并的含义是将两个或两个以上的有序表合并成一个新的有序表。归并排序有多路归并排序、两路归并排序 , 可用于内排序,也可以用于外排序。这里仅对内排序的两路归并方法进行讨论。
1.两路归并排序算法思路
①把 n 个记录看成 n 个长度为1的有序子表;
②进行两两归并使记录关键字有序,...
分类:
编程语言 时间:
2014-05-07 11:47:08
阅读次数:
347
题意:两两相邻的元素可以交换,问最小交换次数使得数列为升序。
思路:归并排序分治法。看到琦神又用了树状数组的方法求。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define P...
分类:
其他好文 时间:
2014-05-07 08:54:01
阅读次数:
488
package mydata;
public class MyMergeSort {
/**
*
* 1.递归拆分
* 2.合并
* 归并排序 先将初始的序列表看成是n个长度为1的有序表
* (1)定义指针i,指向第一个序列表的第一个元素
* (2)定义指针j,指向第二个序列表的第一个元素
* (3)比较i,j指向的元素大小,若前者大,将后者插入到新表中 否...
分类:
编程语言 时间:
2014-05-07 06:21:54
阅读次数:
275
该算法基于一个简单的操作:
将两个有序的队列合成一个更大的有序队列。归并排序保证NlogN。原地归并的抽象算法(Abstract in-place merge):using
System;namespace MergeSort{ class Program { static...
分类:
其他好文 时间:
2014-05-06 14:34:28
阅读次数:
325