0%

排序算法

陆续更新的排序算法解析

选择排序

介绍

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。

1
2
3
4
5
6
7
8
9
10
11
12
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]);
}
}

实践

selectionSort.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<iostream>
#include<algorithm>
#include<string>
#include"Student.h"
using namespace std;
//选择排序

//通过typename设置泛型数组
template<typename T>
void selectionSort(T 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,7,8,5,4,3,6,2,1};
selectionSort(a,10);
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;

string c[5]={"D","C","E","B","A"};
selectionSort(c,5);
for(int i=0;i<5;i++){
cout<<c[i]<<" ";
}
cout<<endl;

Student d[4] = { {"D",90} , {"C",100} , {"B",95} , {"A",95} };
selectionSort(d,4);
for( int i = 0 ; i < 4 ; i ++ ){
cout<<d[i];
}
cout<<endl;
return 0;
}

添加头文件,设置Student结构体,用于比较学生成绩。

Student.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef SELECTIONSORT_STUDENT_H
#define SELECTIONSORT_STUDENT_H

#include <iostream>
#include <string>

using namespace std;

struct Student{
string name;
int score;

//<小于号方法重载
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 //SELECTIONSORT_STUDENT_H

输出结果:
1 2 3 4 5 6 7 8 9 10
A B C D E
Student: C 100
Student: A 95
Student: B 95
Student: D 90

插入排序

介绍

插入排序是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<typename T>
void insertionSort(T arr[], int n){

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

// 寻找元素arr[i]合适的插入位置
// 写法1
// for( int j = i ; j > 0 ; j-- )
// if( arr[j] < arr[j-1] )
// swap( arr[j] , arr[j-1] );
// else
// break;

// 写法2
for( int j = i ; j > 0 && arr[j] < arr[j-1] ; j -- )
swap( arr[j] , arr[j-1] );

}

return;
}