• 第二章 算法基础


    1.循环不变式,需要被证明的3条性质:
    A:初始化:循环的第一次迭代之前,它为真
    B:保持:如果循环的某次迭代之前为真,下次迭代前仍为真
    C:终止:在循环终止时,循环不变式为我们提供一个性质,该性质有助于证明算法是正确的
    
    
    2.
    A:一般衡量一个算法优劣,往往集中于只求最坏情况运行时间
    B:对于算法的运行时间的函数,我们一般只关心最重要的项,这样可以得到简单的抽象
    
    
    3.
    A:分治法思想:将原问题分解为几个规模较小的但是类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解
    
    
    4.插入、合并、冒泡、stl::sort、qsort、误打误撞写出来的插入-冒泡法
    #include "stdafx.h"
    #include <Windows.h>
    #include <random>
    #include <algorithm>
    #include <ctime>
    
    
    using std::default_random_engine;
    using std::uniform_int_distribution;
    using std::sort;
    
    
    //合并算法
    void Merge(int* pValue, int nPos0, int nPos1, int nPos2, int* pNewValue[2])
    {
    	int aCount[2] = {nPos1 - nPos0 + 1, nPos2 - nPos1};
    	memcpy(pNewValue[0], pValue + nPos0, sizeof(int) * aCount[0]);
    	memcpy(pNewValue[1], pValue + nPos1 + 1, sizeof(int) * aCount[1]);
    
    	int aIndex[2] = {0, 0};
    	int nTemIndex = 0;
    
    	for (int i = nPos0; i <= nPos2; ++i)
    	{
    		if (aIndex[0] >= aCount[0])
    		{
    			nTemIndex = 1;
    		}
    		else if (aIndex[1] >= aCount[1])
    		{
    			nTemIndex = 0;
    		}
    		else
    		{
    			if (pNewValue[0][aIndex[0]] > pNewValue[1][aIndex[1]])
    			{
    				nTemIndex = 1;
    			}
    			else
    			{
    				nTemIndex = 0;
    			}
    		}
    	
    		pValue[i] = pNewValue[nTemIndex][aIndex[nTemIndex]];
    		++aIndex[nTemIndex];
    	}
    }
    void MergeSort(int* pValue, const int CIndex0, const int CIndex1, int* pNewValue[2])
    {
    	if (CIndex0 < CIndex1)
    	{
    		int nCount = (CIndex1 + CIndex0) / 2;
    		MergeSort(pValue, CIndex0, nCount, pNewValue);
    		MergeSort(pValue, nCount + 1, CIndex1, pNewValue);
    
    		Merge(pValue, CIndex0, nCount, CIndex1, pNewValue);
    	}
    }
    void MergeSort(int* pValue, const int CLen, int* pNewValue[2])
    {
    	int nLen = CLen / 2;
    
    	if (nLen)
    	{
    		MergeSort(pValue, nLen, pNewValue);
    		MergeSort(pValue + nLen, CLen - nLen, pNewValue);
    
    		Merge(pValue, 0, nLen - 1, CLen - 1, pNewValue);
    	}
    }
    
    
    //插入算法
    void InsertSort(int* pValue, const int CLen)
    {
    	int nValue = 0;
    	int nIndex = 0;
    	for (int i = 1; i < CLen; ++i)
    	{
    		nValue = pValue[i];
    		nIndex = i - 1;
    		while(nIndex >= 0 && pValue[nIndex] > nValue)
    		{
    			pValue[nIndex + 1] = pValue[nIndex];
    			--nIndex;
    		}
    		pValue[nIndex + 1] = nValue;
    	}
    }
    
    
    //冒泡法
    void BubbleSort(int* pValue, const int CLen)
    {
    	int nTem = 0;
    	for (int i = 0; i < CLen; ++i)
    	{
    		for (int j = i + 1; j < CLen; ++j)
    		{
    			if (pValue[i] > pValue[j])
    			{
    				nTem = pValue[j];
    				pValue[j] = pValue[i];
    				pValue[i] = nTem;
    			}
    		}
    	}
    }
    
    
    //误打误撞写的算法, 命名为 插入-冒泡 法
    void MyInsertAndBubbleSort(int* pValue, const int CLen)
    {
    	int nTem = 0;
    	int nIndex = 0;
    	for (int i = 0; i < CLen; ++i)
    	{
    		nIndex = i;
    
    		while(nIndex > 0 && pValue[nIndex] < pValue[nIndex - 1])
    		{
    			nTem = pValue[nIndex];
    			pValue[nIndex] = pValue[nIndex - 1];
    			pValue[nIndex - 1] = nTem;
    
    			--nIndex;
    		}
    	}
    }
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	const int CSize = 1024 * 10;
    	int* pValue[3] = {new int[CSize], new int[CSize], new int[CSize]};
    	int* pNewValue[2] = {new int[CSize], new int[CSize]};
    
    	default_random_engine deEngine;
    	uniform_int_distribution<int> disInt;
    
    	for (int i = 0; i < CSize; ++i)
    	{
    		int nValue = disInt(deEngine);
    		pValue[0][i] = nValue;
    		pValue[1][i] = nValue;
    		pValue[2][i] = nValue;
    	}
    
    	clock_t nBegin = clock();
    	nBegin = clock();
    	sort(pValue[0], pValue[0] + CSize);
    	clock_t nStlSort = clock() - nBegin;
    	/*
    	CSize = 1024 * 10;				nStlSort = 11
    	CSize = 1024 * 100;				nStlSort = 143
    	CSize = 1024 * 1024;			nStlSort = 1627
    	CSize = 1024 * 1024 * 10;		nStlSort = 19240
    	*/
    
    	nBegin = clock();
    	qsort(pValue[1], CSize, sizeof(int), QSortCmp);
    	clock_t nQSort = clock() - nBegin;
    	memcpy(pValue[1], pValue[2], CSize * sizeof(int));
    	/*
    	CSize = 1024 * 10;				nQSort = 4
    	CSize = 1024 * 100;				nQSort = 55
    	CSize = 1024 * 1024;			nQSort = 661
    	CSize = 1024 * 1024 * 10;		nQSort = 7691
    	*/
    
    	nBegin = clock();
    	MergeSort(pValue[1], CSize, pNewValue);
    	clock_t nMergeSort0 = clock() - nBegin;
    	memcpy(pValue[1], pValue[2], CSize * sizeof(int));
    	/*
    	CSize = 1024 * 10;				nMergeSort0 = 2
    	CSize = 1024 * 100;				nMergeSort0 = 26
    	CSize = 1024 * 1024;			nMergeSort0 = 299
    	CSize = 1024 * 1024 * 10;		nMergeSort0 = 3303
    	*/
    
    	nBegin = clock();
    	MergeSort(pValue[1], 0, CSize - 1, pNewValue);
    	clock_t nMergeSort1 = clock() - nBegin;
    	memcpy(pValue[1], pValue[2], CSize * sizeof(int));
    	/*
    	CSize = 1024 * 10;				nMergeSort1 = 2
    	CSize = 1024 * 100;				nMergeSort1 = 25
    	CSize = 1024 * 1024;			nMergeSort1 = 291
    	CSize = 1024 * 1024 * 10;		nMergeSort1 = 3294
    	*/
    
    	nBegin = clock();
    	InsertSort(pValue[1], CSize);
    	clock_t nInsertSort = clock() - nBegin;
    	memcpy(pValue[1], pValue[2], CSize * sizeof(int));
    	/*
    	CSize = 1024 * 10;				nInsertSort = 63
    	CSize = 1024 * 100;				nInsertSort = 6098
    	CSize = 1024 * 1024;			等了几分钟也没结束,就不等了
    	*/
    
    	nBegin = clock();
    	MyInsertAndBubbleSort(pValue[1], CSize);
    	clock_t nMyInsertAndBubbleSort = clock() - nBegin;
    	memcpy(pValue[1], pValue[2], CSize * sizeof(int));
    	/*
    	CSize = 1024 * 10;				nMyInsertAndBubbleSort = 94
    	CSize = 1024 * 100;				nMyInsertAndBubbleSort = 9398
    	CSize = 1024 * 1024;			不等了
    	*/
    
    	nBegin = clock();
    	BubbleSort(pValue[1], CSize);
    	clock_t nBubbleSort = clock() - nBegin;
    	memcpy(pValue[1], pValue[2], CSize * sizeof(int));
    	/*
    	CSize = 1024 * 10;				nBubbleSort = 229
    	CSize = 1024 * 100;				nBubbleSort = 26677
    	CSize = 1024 * 1024;			不等了
    	*/
    
    	return 0;
    }
    

      

  • 相关阅读:
    Vue打包之后部署到 express 服务器上
    Vue 点击事件传递原生DOM事件?
    CSS hover 改变另外一个元素状态
    element-UI el-table二次封装
    element-UI el-table添加序号列时序号永远都是从1开始?
    element-UI el-table表格根据搜索条件表格值改变颜色
    HTML head meta标签详细
    CodeForces 489C Given Length and Sum of Digits... (dfs)
    CodeForces 489B BerSU Ball (水题 双指针)
    Codeforces 489A SwapSort (水题)
  • 原文地址:https://www.cnblogs.com/szn409/p/7491970.html
Copyright © 2020-2023  润新知