算法初步

1, 选择排序

最简单粗暴地,也是大O比较大的


#include <iostream>

 

#include <algorithm>

 
 
 

using namespace std;

 
 
 

void selectionSort(int arr[], int n){

 
 
 

for(int i = 0 ; i < n ; i ++){

 

// 寻找[i, n)区间里的最小值

 

int minIndex = i;

 

for( int j = i + 1 ; j < n ; j ++ )

 

if( arr[j] < arr[minIndex] )

 

minIndex = j;

 
 
 

swap( arr[i] , arr[minIndex] );

 

}

 
 
 

}

 
 
 

int main() {

 
 
 

int a[10] = {10,9,8,7,6,5,4,3,2,1};

 

selectionSort(a,10);

 

for( int i = 0 ; i < 10 ; i ++ )

 

cout<<a[i]<<" ";

 

cout<<endl;

 
 
 

return 0;

 

}

注意:只针对整形数组进行排列

2, 利用泛型模板进行排序,使得排序的对象更加多种多样(在数据结构中其实也可以使用泛型模板)

在函数前加上template<typename T>,将排序数组类型声明为T类型


#include <iostream>

 

#include "Student.h"

 
 
 

using namespace std;

 
 
 

template<typename T>

 

void selectionSort(T arr[], int n){

 
 
 

for(int i = 0 ; i < n ; i ++){

 
 
 

int minIndex = i;

 

for( int j = i + 1 ; j < n ; j ++ )

 

if( arr[j] < arr[minIndex] )

 

minIndex = j;

 
 
 

swap( arr[i] , arr[minIndex] );

 

}

 

}

 
 
 

int main() {

 
 
 

// 测试模板函数,传入整型数组

 

int a[10] = {10,9,8,7,6,5,4,3,2,1};

 

selectionSort( a , 10 );

 

for( int i = 0 ; i < 10 ; i ++ )

 

cout<<a[i]<<" ";

 

cout<<endl;

 
 
 

// 测试模板函数,传入浮点数数组

 

float b[4] = {4.4,3.3,2.2,1.1};

 

selectionSort(b,4);

 

for( int i = 0 ; i < 4 ; i ++ )

 

cout<<b[i]<<" ";

 

cout<<endl;

 
 
 

// 测试模板函数,传入字符串数组

 

string c[4] = {"D","C","B","A"};

 

selectionSort(c,4);

 

for( int i = 0 ; i < 4 ; i ++ )

 

cout<<c[i]<<" ";

 

cout<<endl;

 
 
 

}

此外,我们可以自定义一个类型,对其进行排序,声明一个头文件,


#ifndef INC_02_SELECTION_SORT_USING_TEMPLATE_STUDENT_H

 

#define INC_02_SELECTION_SORT_USING_TEMPLATE_STUDENT_H

 
 
 

#include <iostream>

 

#include <string>

 
 
 

using namespace std;

 
 
 
 
 

struct Student{

 
 
 

string name;

 

int score;

 
 
 

// 重载小于运算法,定义Student之间的比较方式

 

// 如果分数相等,则按照名字的字母序排序

 

// 如果分数不等,则分数高的靠前

 

bool operator<(const Student& otherStudent){

 

return score != otherStudent.score ?

 

score > otherStudent.score : name < otherStudent.name;

 

}

 
 
 
 
 
 

friend ostream& operator<<(ostream &os, const Student &student){

 
 
 

os<<"Student: "<<student.name<<" "<<student.score<<endl;

 

return os;

 

}

 

};

 
 
 

#endif

3,随机生成算法测试用例

建立一个头文件,如下:

#ifndef SORTTESTHELPER_H_INCLUDED

#define SORTTESTHELPER_H_INCLUDED

#include<iostream>

#include<ctime>

#include<cassert>

using namespace std;

namespace SortTestHelper{

int *generateRandomArray(int n,int rangeL,int rangeR){

assert(rangeL<=rangeR);

int *arr=new int [n];

srand(time(NULL));

for(int i=0;i<n;i++)

arr[i]=rand()%(rangeR-rangeL+1)+rangeL;

return arr;

}

template<typename T>

void printArray(T arr[],int n){

for(int i=0;i<n;i++)

cout<<arr[i]<<" ";

cout<<endl;

}

}

#endif // SORTTESTHELPER_H_INCLUDED

主函数:

int main() {

// 测试模板函数,传入整型数组

int N = 20000;

int *arr = SortTestHelper::generateRandomArray(N,0,N);

selectionSort(arr,N);

for(int i=0;i<N;i++)

cout<<arr[i]<<" ";

cout<<endl;

//SortTestHelper::printArray(arr,N);

delete[] arr;

return 0;

}随机生成10000个数排序

不谋万世者,不足谋一时。算是给自己个约定吧,2年期限。不求最后玩转算法,只希望到最后不要被算法反杀。

原文地址:https://www.cnblogs.com/daishangjing/p/9912359.html

时间: 2024-08-06 06:33:55

算法初步的相关文章

[从头学数学] 第174节 算法初步

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了结丹中期的修炼, 这次要修炼的目标是[算法初步]. 正剧开始: 星历2016年04月12日 08:54:58, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起研究[算法初步]. [人叫板老师]指点小伟说:"这金丹要想大成,顺利进入元婴期,就必须进行九转培炼. 这什么是九转培炼法门呢?就是要先快速的修炼[天地人正册]进入后期,不要管各种辅修 功法,然后从头游历[天地人列国],在游历中增长见闻,精炼神通,最后再修炼[术.

算法初步——排序 A1012.The Best Rank(25)

#include <bits/stdc++.h> #include<math.h> using namespace std; const int MAX_LEN = 2005; //const int MAX_D = 31; struct student{ int id; int Cgrade; int Mgrade; int Egrade; int Agrade; }stu[MAX_LEN]; int main(){ int n,m; scanf("%d%d"

KMP算法初步理解

看了两天KMP算法,不知道理解的对不,初步理解总结如下:(主要是各种next数组把自己整晕了,有彻底懂的大神们再给指导下) 首先是思路,"字符串匹配的KMP算法_知识库_博客园"http://kb.cnblogs.com/page/176818/,问题的关键落在求数组上,而求数组实际是对自身求匹配度,所以求next数组的子函数和主函数很类似,所以网上讨论的好像主要是两种next数组,最好把相应的主函数列出来,还有像第二种的next和nextval数组都可用,在主函数相同的情况下,弥补一

Dijkstra算法初步 - 迷宫问题

你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数.还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间.游戏规定了你的起点和终点房间,你首要目标是从起点尽快到达终点,在满足首要目标的前提下,使得你的得分总和尽可能大.现在问题来了,给定房间.道路.分数.起点和终点等全部信息,你能计算在尽快离开迷宫的前提下,你的最大得分是多少么? Input 第一行4个整数n (<=500), m, start, end.n表示房

算法初步:快速乘,快速幂,矩阵快速幂

原创 by zoe.zhang 在刷题的时候遇到了问题,就是当循环或者递推的次数非常大的情况下获取一定结果,这个时候如果作普通运算,那么很容易就超时了,而且有时候结果也大得超范围了,即使是long long类型的也放不下,然后给了提示说是运用快速幂的思想.所以这里对快速幂做了一点思考和探讨. 1.快速乘,快速幂,矩阵快速幂三者的关系 不管是快速乘,还是快速幂算法,实际上都包含了分解问题的思想在里面,将O(n)的复杂度降到O(lgn).学习的时候,一般学习快速幂算法,再由此推广去解决矩阵快速幂问题

C语言之算法初步(汉诺塔--递归算法)

个人觉得汉诺塔这个递归算法比电子老鼠的难了一些,不过一旦理解了也还是可以的,其实网上也有很多代码,可以直接参考.记得大一开始时就做过汉诺塔的习题,但是那时代码写得很长很长,也是不理解递归的结果.现在想起来汉诺塔的算法就3个步骤:第一,把a上的n-1个盘通过c移动到b.第二,把a上的最下面的盘移到c.第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了.所以算法看起来就简单多了.不过,思考过程还是很痛苦的,难以理解.递归中会保存数据的好处在这里又得到体现,太神奇了. 汉诺塔代码如下:

【原创】tarjan算法初步(强连通子图缩点)

tarjan算法的思路不是一般的绕!!(不过既然是求强连通子图这样的回路也就可以稍微原谅了..) 但是研究tarjan之前总得知道强连通分量是什么吧.. 上百度查查: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.有向图的极大强连通子图,称为强连通分量(strongly connected co

(算法初步学习)蛮力法解决生成子集问题

关于蛮力法求生成子集问题 对于算法分析中的问题我已经不想对自己说什么了,到了大三了,竟然还是小白.对生成子集问题我研究了一下午,最后终于想通了.思路:   1.利用<math.h> 头文件中的pow(x,y)函数来求得2的n次方,作为外循环.2.然后写一个将10进制数转换为2进制数的函数(当然,C中有专门的转换进制的函数在<stdlib.h>中,但是,他转换下来  5不是0101而是101,这就导致需要分开判断,所以不用itoa函数).如下:conversation(int n,i

分治算法初步

hdu1007 http://acm.hdu.edu.cn/showproblem.php?pid=1007 解题关键:分治算法求解,注意学习分治算法的写法 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cmath> 6 #include<iostream> 7 #define inf 0x3f3f

KPM算法初步理解

一个字符串"FBCABCDABABCDABCDABYW"中是否包含另外一个字符串"ABCDABY"? 上面这道题目是一个经典的字符串匹配的题目,对于字符串匹配,比较好的算法里很容易想到KPM算法,那KPM算法是干什么的?为什么说KPM比较优秀? 给定一个字符串O和F,长度分别是m.n,判断F是否在O中出现,如果出现则返回出现的位置.常规方法是遍历O的每一个字符,与F的每一个字符进行比较,但是这种方法的时间复杂度是T(m*n),但是KPM算法使得时间复杂度为T(m+n