数据结构算法经典合集

因为近期要准备校招面试,所以将严蔚敏版本号的《数据结构》又拿过来温习一遍,应该看了不下于5遍了吧,呵呵,当中多少遍无所谓,关键是得亲自己主动手去调试,才有新发现。

本篇博文就来整理下经典的排序算法(未完待续...)

不凝视的代码说明不是必需凝视啊~

/* ==========================================================
				数据结构经典算法合集
   ==========================================================
   By	gujj	20140727
*/

#include <iostream>
#include<cstdlib>
#include<ctime>

using namespace std;

#define N 8

/*-----------------------------------------------------------------
*                void RandNum(int *List)
* -----------------------------------------------------------------
* 随机数生成函数
*/
void RandNum(int *List)
{
	// 用于保证是随机生成的数
	// 不同的种子能够生成不同的随机数
	srand((unsigned)time(NULL)); 
	// srand((unsigned)time(0));
	for(int i=0; i<N; i++)
	{	
		List[i] = rand()%N;
	}

}

/*-----------------------------------------------------------------
*                void OutPut(int* List)
* -----------------------------------------------------------------
* 输出函数
*/
void OutPut(int *List)
{
	for(int i=0; i<N;i++)
		cout<<List[i]<<"	";
	cout<<endl;
}

/*-----------------------------------------------------------------
*                void InsertSort(int* List)
* -----------------------------------------------------------------
* 插入排序
*/
void InsertSort(int *List)
{
	// key,
	int key,i,j;
	for(i=1; i<N; i++)
	{
		key = List[i];
		j = i-1;
		while(j>=0 && key < List[j])
		{
			List[j+1] = List[j];
			--j;
		}
		List[j+1] = key;
	}
}

/*-----------------------------------------------------------------
*             void QSort(int *List, int low, int high)
* -----------------------------------------------------------------
* 高速排序
*/
// 一趟排序
int Partition(int *List, int low, int high)
{
	int key = List[low];
	while(low < high)
	{
	    // 若 high位置的值不比key值小。则不是必需移动
		while( low < high && List[high] >= key) --high;
		List[low] = List[high];
		// 若 low位置的值不比key值大,则不是必需移动
		while( low < high && List[low] <= key) ++low;
		List[high] = List[low];
	}
	List[low] = key;
	return low;
}

void QSort(int *List, int low, int high)
{
	int pivot;
	if(low < high)
	{
		// 获取中轴值
		pivot = Partition(List,low,high);
		// 中轴左边排序
		QSort(List,low,pivot-1);
		// 中轴右边排序
		QSort(List,pivot+1,high);
	}
}

/*-----------------------------------------------------------------
*             void HeapSort(int *List, int low, int high)
* -----------------------------------------------------------------
* 堆排序
*/
// 堆筛选
void HeapAdjust(int *List, int s, int e)
{
	// 已知 L[s-e]中的keyword。除L[s]之外均满足大顶堆的定义
	// 本函数实现调整L[s]使L[s-e]符合大顶堆定义,即筛选
	int key = List[s];
	for(int i = 2*s; i<=e; i*=2)
	{
		// 选取较大孩子节点向下筛选
		if(i<e && List[i]<List[i+1]) ++i;
		// 若 key 比最大的孩子List[i]还大,符合大顶堆定义
		// 此时,key应该放置在 s 位置上
		if(key >= List[i]) break;
		// 若 key 比 最大的孩子小。将最大孩子置换到顶端
		List[s] = List[i]; 
		s = i;		
	}
	// 将 key 放入正确的位置
	List[s] = key;
}

void HeapSort(int *List)
{
	int tmp;
	// 从 N/2位置 開始向前调整。即比較相关的孩子结点。调整为大顶堆
	for(int i = N/2; i>=0; --i)
		HeapAdjust(List,i,N-1);
	// 对大顶堆 List顺序表 进行堆排序,得到的顺序表为升序序列
	for(int i = N-1; i>0; --i)
	{
		// 将堆顶的元素List[0]和未排序的子序列List[1 - N-1]中最后一个元素置换
		tmp = List[0];
		List[0] = List[i];
		List[i] = tmp;
		// 将序列 List[0 - i-1]进行筛选
		HeapAdjust(List,0,i-1);
	}
}

/*-----------------------------------------------------------------
*                int main(int argc, char *argv[])
* -----------------------------------------------------------------
* 主函数
*/
int main(int argc, char *argv[])
{
    // 计时函数
	clock_t t_start,t_end;
	
	int List[N];
	// 调用随机函数并初始化数组
	RandNum(List);
	OutPut(List);
	
	// 開始计时
	t_start=clock();
	
	// 调用算法函数
	cout<<"Insert Sort:"<<endl;
	InsertSort(List);
	OutPut(List);
	
	cout<<"Quick Sort:"<<endl;
	QSort(List,0,N);
	OutPut(List);
	
	cout<<"Heap Sort:"<<endl;
	HeapSort(List);
	OutPut(List);
	
	// 结束计时
	t_end=clock();
	cout<<"The needed time:"<<difftime(t_end,t_start)<<endl;

	return (0);
}


用g++编译器运行,有例如以下结果(注:数据是採用随机函数生成。通过设置N大小来定义):

king@king-desktop:/var/test/Algo$ ls
insertSort.cpp  test.sh
king@king-desktop:/var/test/Algo$ sh test.sh 
1	6	0	3	7	4	4	4	
Insert Sort:
0	1	3	4	4	4	6	7	
Quick Sort:
0	1	3	4	4	4	6	7	
Heap Sort:
0	1	3	4	4	4	6	7	
The needed time:0
king@king-desktop:/var/test/Algo$ cat test.sh 
#!/bin/sh

g++ -o test insertSort.cpp

./test

rm -rf test
king@king-desktop:/var/test/Algo$


原文地址:https://www.cnblogs.com/mengfanrong/p/5148033.html