STL经典算法集锦<一>之list::sort

原创 2012年03月23日 15:27:36
算法中使用到的数据结构:
typedef struct Node* Link;
struct Node{
		int value;
		Link next;
};
算法代码:
//链表的归并
void merge(Link& first,Link& second)
{
		Node newHead;
		Link temp=&newHead;
		while(first!=NULL&&second!=NULL)
		{
				if(first->value<=second->value)
				{
					    temp->next=first;
				        first=first->next;
				}
				else
				{
				        temp->next=second;
						second=second->next;
				}
				temp=temp->next;
		}
		if(first!=NULL)
		{
				while(first!=NULL)
				{
					    temp->next=first;
				        first=first->next;
				        temp=temp->next;
				}
		}
		else
		{
				while(second!=NULL)
				{
				        temp->next=second;
						second=second->next;
				        temp=temp->next;
				}
		}
		first=newHead.next;
}
//声明为引用类型,以head始终指向链表头而不是原链表的头节点
void mergeSort(Link& head)
{
		//用于存放已序的链表的指针数组
		Link array[64];
		int fill=0;
		while(head!=NULL)
		{
				int i=0;
				//每次分割出单个节点
				Link p=head;
				head=head->next;
				p->next=NULL;
				//向上滚动的条件是链表array[i]元素个数满足2^n
				//持续向上滚动合并,直至该array[i]中的数据为空不足以持续向上滚动合并
				while(i<fill&&array[i]!=NULL)
				{
						merge(array[i],p);
						swap(p,array[i++]);
				}
				swap(p,array[i]);
				if(i==fill) fill++;
		}
		//将所有已序链表归并
		for(int i=0;i<fill;i++)
			merge(head,array[i]);
}

验证代码:

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
		int len=20;
		srand(time(0));
		Link head=new Node;//构造链表头
		head->value=25;
		cout<<head->value<<"\t";
                Link p=head;
		//随机创建一个链表
		for(int i=0;i<len;i++)
		{
				Link next=new Node;
				p->next=next;
				next->value=rand()%200;
				cout<<next->value<<"\t";
				p=p->next;
		}
		cout<<endl;
		p->next=NULL;
		//调用归并排序
		mergeSort(head);
		//输出排序后的结果
		p=head;
		while(p!=NULL)
		{
				cout<<p->value<<"\t";
				p=p->next;
		}
		return 0;
}

单次输出:


相关文章推荐

STL经典算法集锦<三>之partition与qsort

STL的分割算法主要使用了仿函数来实现。而此处的分割则不,此处实现了两种形式的分割算法:非随机分割算法、随机分割算法(随机算法是在非随机算法的基础上封装而成)。而快速排序则只需简单依赖分割算法就能实现...

STL经典算法集锦<六>之排列(next_permutation/prev_permutation)

STL中涉及到数组的排列的有两个函数,即next_permutation/prev_permutation,分别用于求上一个以及下一个排列。两函数的算法使用的原理大体相同。以next_permutat...

STL经典算法集锦<七>之随机洗牌(random_shuffle)

将一个数组中的元素序列打算顺序进行重排,并需要保证重排后的每一种结果是等概率且随机的。下面的两种算法哪一种是正确的?(注:random(a,b)返回一个a~b的随机整数) 1. for i=1 to...

STL经典算法集锦<四>之rotate

STL在rotate上的优化是极尽其所能的。分别对前向访问,双向访问,随机访问的数据结构实现了三个版本的rotate。下面是自己按照对三种算法的理解,自己进行的实现。实现中我尽力避免使用C++的特性,...

STL经典算法集锦<八>之IntroSort

STL的sort算法的优化策略: 1、  数据量大时采用QuickSort,分段递归排序。 2、  一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来的额外负荷,就改用Ins...

STL经典算法集锦<五>之查找(lower_bound/upper_bound/binary_search)

这三个算法都比较的常用,而且具有一定的相似的性。理论依据也很明显,下面就直接贴出自己的实现版本。其中lower_bound与upper_bound实现了两个版本。版本一与STL的实现方法完全相同,以数...

STL经典算法集锦<二>之堆算法

堆算法主要包括建立最大堆和堆排序算法。所使用建堆的数组将以0开始存储数据。 下面将以两种方法建堆:自底向上的建堆(STL和算法导论中使用到的)、自顶向下建堆(即插入建堆的方法) 公共操作: ...

十三个经典算法集锦

作者:July。 微博:http://weibo.com/julyweibo。 出处:http://blog.csdn.net/v_JULY_v。 前言     本人的原创作品,经典算法研究系...

Java 经典算法面试题集锦

1.随机产生20个不能重复的字符并排序 package com.test.kaoshi; import java.util.HashSet; import java.util.Iterator; ...

白话经典算法系列之六 快速排序(Quick sort)

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL经典算法集锦<一>之list::sort
举报原因:
原因补充:

(最多只允许输入30个字)