算法初步

Posted daishangjing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法初步相关的知识,希望对你有一定的参考价值。

算法初步

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年期限。不求最后玩转算法,只希望到最后不要被算法反杀。

以上是关于算法初步的主要内容,如果未能解决你的问题,请参考以下文章

BF与KMP算法的初步认知

算法初步

机器学习Sklearn的k近邻算法api初步使用

算法分析初步

算法初步

初步算法