您的位置:首页 > 理论基础 > 数据结构算法

数据结构算法经典合集

2016-01-21 13:54 399 查看
因为近期要准备校招面试,所以将严蔚敏版本号的《数据结构》又拿过来温习一遍,应该看了不下于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]<<"\t";
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
;
// 调用随机函数并初始化数组
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$
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: