【算法思路】时间复杂度限制在O(n log n),我们可以第一时间想到常用的二路归并排序,快速排序和堆排序,其中快排和堆排只适用于线性表,即数组,故这道编程题毫无疑问用二路归并排序;
【编程步骤】
* 1. 利用一个小技巧,可以设置慢行指针low和快行指针fast,把链表分成两部分来操作,即first和second链表
* 2. 递归排序first和second链表,即
first=sortList(head);
second=sortList(second);
* 3. 合并这两个链表,即:...
分类:
其他好文 时间:
2014-11-18 10:23:15
阅读次数:
185
目前比较成熟的排序算法有选择排序,插入排序,希尔排序,归并排序,快速排序以及堆排序。如下表所示,比较了各个排序算法之间的优劣势。
上述算法的具体实现
选择排序:选择排序具体实现与分析
插入排序:插入排序具体实现与分析
希尔排序:希尔排序具体实现与分析
归并排序:归并排序具体实现与分析
快速排序:快速排序具体实现与分析
堆排序:堆排序具体实现与分析...
分类:
编程语言 时间:
2014-11-16 23:11:38
阅读次数:
377
堆排序是利用堆进行排序的高效算法,其能实现O(NlogN)的排序时间复杂度,具体算法分析可以点击堆排序算法时间复杂度分析。
算法实现:
调整堆:
void sort::sink(int* a, const int root, const int end)
{
int i=root;
while(2*i +1 <= end)
{
int k = 2*i+1;
if(k+1<=e...
分类:
编程语言 时间:
2014-11-16 23:09:56
阅读次数:
447
用数组实现一个小根堆,并完成排序的操作。(具体请看注释)
堆的基本操作实际上就几种:
1.向下调整操作AdjustDown()
2.向上调整操作AdjustUp() (向堆中插入元素时用到)
3.建堆操作BuildHeap(),其中要不断调用AdjustDown()来维护堆的性质
4.弹出堆顶元素GetRoot(),之后也要用到AdjustDown()来维护堆
ps(关于建堆):如...
分类:
编程语言 时间:
2014-11-15 00:13:42
阅读次数:
207
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据非常大,一次不能容纳所有的排序记录,在排序过程中须要訪问外存。我们这里说说八大排序就是内部排序。 当n较大,则应採用时间复杂度为O(nlog2n)的排序方法:高速排序、堆排序或归并排序序。 高速排序:是眼下基于...
分类:
编程语言 时间:
2014-11-13 18:13:04
阅读次数:
269
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较...
分类:
编程语言 时间:
2014-11-11 22:37:12
阅读次数:
372
2. 选择排序—堆排序(Heap Sort)堆排序是一种树形选择排序,是对直接选择排序的有效改进。基本思想:堆的定义如下:具有n个元素的序列(k1,k2,...,kn),当且仅当满足时称之为堆。由堆的定义可以看出,堆顶元素(即第一个元素)为最小项(小顶堆)。若以一维数组存储一个堆,则堆对应一颗完全二...
分类:
编程语言 时间:
2014-11-07 20:44:41
阅读次数:
296
1. 介绍 排序算法是将一串数据按照某种特定排序方式(规则)进行排序的算法。分为内部排序和外部排序。 内部排序:指排序数据存储在内存中,依照依照某种排序方式(规则)进行排序。内部排序不适合太大的数据。内部排序的八中排序算法:冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序、快速排序、基数.....
分类:
编程语言 时间:
2014-11-07 16:46:05
阅读次数:
233