# 数据结构算法经典合集

/* ==========================================================
数据结构经典算法合集
==========================================================
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]中的关键字，除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)
// 对大顶堆 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]进行筛选
}
}

/*-----------------------------------------------------------------
*                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);
}


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$

07-23

03-17 435
10-10 4251
03-23
10-18 6839
12-30 378
09-24 6177
05-07 1424
05-04 60