zoukankan      html  css  js  c++  java
  • 数据结构算法经典合集

    因为近期要准备校招面试,所以将严蔚敏版本号的《数据结构》又拿过来温习一遍,应该看了不下于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$


  • 相关阅读:
    spring boot打包出现yaml配置文件问题
    spring boot定时器使用异常
    常见mysql死锁案例行死锁与表死锁
    数据库三范式
    【leetcode】26. 删除排序数组中的重复项
    【数据结构与算法】10.2 二叉排序树
    【设计模式】5、适配器设计模式之对象适配器
    【数据结构与算法】10.1、赫夫曼树代码实现
    【设计模式】4、建造者模型以及Stringbuilder源码分析
    【设计模式】2、工厂模式之简单工厂、方法工厂、抽象工厂
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5148033.html
Copyright © 2011-2022 走看看