归并排序的原理:如果数组的元素个数大于1,则: 将数组平均分为两部分; 左边的数组归并排序;递归 右边的数组归并排序;递归 将两个各自有序的数组合并,需要一个额外的辅助数组,暂时保存合并结果;返回否则,数组元素个数为1时,已经有序;直接返回。稳定排序。时间复杂度在最坏、最好、平均情况下都为O...
分类:
其他好文 时间:
2014-08-12 00:27:53
阅读次数:
223
二路归并排序的时间复杂度是O(n*log2n),空间复杂度是O(n)。
代码如下:
/**
* 源码名称:MergeSort.java
* 日期:2014-08-11
* 程序功能:合并排序
* 版权:CopyRight@A2BGeek
* 作者:A2BGeek
*/
public class MergeSort {
public void mergeSort(int[]...
分类:
其他好文 时间:
2014-08-11 17:52:02
阅读次数:
204
基础知识: 排序:通过计算机手段将一组随机无序的数列变成有序的数列。常用排序算法有很多,主要有如下的几种: 包括插入排序,冒泡排序,选择排序,堆排序,归并排序,计数排序,基数排序,桶排序,快速排序等。 插入排序,堆排序,选择排序,归并排序和快速排序,冒泡排序都是比较排序,它们通过对数组中的元素...
分类:
其他好文 时间:
2014-08-11 14:45:42
阅读次数:
282
堆排序与高速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先解说下什么是数据结构中的二叉堆。二叉堆的定义二叉堆是全然二叉树或者是近似全然二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)不论什么一个子节点的键值。2.每一个结点的左子树和右...
分类:
其他好文 时间:
2014-08-10 23:54:20
阅读次数:
289
原文:http://blog.csdn.net/t12x3456/article/details/7430700各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序一、冒泡排序(BubbleSort)1. ...
分类:
编程语言 时间:
2014-08-10 21:10:51
阅读次数:
429
(冒泡,选择,插入,希尔,快速,归并,堆排)周末加班学习C++,打算用C++写七大经典排序代码。之前写好的C实现代码debug后运行良好。之前的mysortlib.c中函数声明如下,接口完全是一样的。void _bubsort(int arr[], int len);void _bubsort_(i...
分类:
其他好文 时间:
2014-08-10 18:16:10
阅读次数:
198
题目地址:POJ 2299
这题曾经用归并排序做过,线段树加上离散化也可以做。一般线段树的话会超时。
这题的数字最大到10^10次方,显然太大,但是可以利用下标,下标总共只有50w。可以从数字大的开始向树上加点,然后统计下标比它小即在它左边的数的个数。因为每加一个数的时候,比该数大的数已经加完了,这时候坐标在它左边的就是一对逆序数。
但是该题还有一个问题,就是数字重复的问题。这时候可以在排序...
分类:
其他好文 时间:
2014-08-10 15:43:20
阅读次数:
210
快速排序法作为一种分治法的算法,和归并排序法的差别在于,前者是先比较,后拆分,而后者是先拆分,在合并的过程中进行比较。快速排序法在原理上简单总结就是:切分:拿数组第一个数(也可以是随机任意一个)作为中心点(pivot);扫描其它所有数,将小于这个中心点的数归类到左边,大于中心点的归类到右边;将左边(...
分类:
其他好文 时间:
2014-08-10 15:22:30
阅读次数:
208
首先,归并排序,分治,递归解决小的范围,再合并两个有序的小范围数组,便得到整个有序的数组。
这是很适合用递归来写的,至于非递归,便是从小到大,各个击破,从而使得整个数组有序。代码如下:
void merge(vector &A, int left, int mid, int right)
{
int i=left,j=mid+1;
vector tmp(right-left+1,0);...
分类:
其他好文 时间:
2014-08-10 13:08:00
阅读次数:
235
说明:归并排序: 时间 O(nlogn),空间 O(1). 每次将链表一分为二, 然后再合并。快排(用两个指针)
说明: 与顺序表不同的时,每次找插入位置时从头开始走。
分类:
其他好文 时间:
2014-08-10 01:40:39
阅读次数:
226