(本篇实现均为升序)
1.冒泡排序
最经典的排序算法。其思想是遍历未排序序列,通过比较相邻元素的值从而实现每次循环后将未排序序列中的最大值(构建升序序列)移至最后,后面的序列就是自动形成的有序序列,之前的序列被看做为排序序列。
算法实现:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18int* bubble_sort(int arr[], int len){
bool flag = false;
for(int i = 0;i < len - 1; i++){
for(int j = 0;j < len - 2 - i;j++){
if(arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true;
}
}
if(!flag){
break;
}
flag = false;
}
return arr;
}
2.选择排序
应该是人们最容易想到的算法,其思想将序列分为有序和未排序两部分,初始的未排序序列就是该序列整体,每次从未排序序列中选取最小的数,与数组前面的元素依次进行交换形成有序序列,直至遍历完毕。
算法实现:1
2
3
4
5
6
7
8
9
10
11
12
13
14int* select_sort(int arr[], int len){
for(int i = 0;i < len - 1;i++){
int min = i;
for(int j = i;j < len - 1;j++){
if(arr[j] < arr[min]){
min = j;
}
}
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
return arr;
}
3.直接插入排序
直接插入排序基本的思想是递归,将数组看做一个有序序列和一个无序序列,最开始有序序列只有一个元素arr[0],其余构成无序序列,每次从无序序列中取出一个元素插入有序序列恰当位置,使之成为有序序列,重复n-1次即可完成排序。
算法实现:1
2
3
4
5
6
7
8
9
10
11
12int* dire_insert_sort(int arr[], int len){
for(int i = 0;i < len - 1;i++){
int cur = arr[i + 1];
int pre = i;
do{
arr[pre + 1] = arr[pre];
pre--;
}while(temp < arr[j] && j >= 0);
arr[pre + 1] = cur;
}
return arr;
}
4.希尔排序
采用了增量减小的排序思想,increment的取值一直有争议,此处increment初始值为len/3取下限+1
通过increment构成划分,再对分别划分进行直接插入,直至increment增量小于等于11
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17int* shell_sort(int arr[], int len){
do{
increment = len / 3 + 1;
for(int i = increment;i < len - 1;i++){
if(arr[i - increment] > arr[i]){
int temp = arr[i];
int j = i - increment;
do{
arr[j] = arr[i];
j -= increment;
}while(arr[j] > temp && j >= 0);
arr[j + increment] = temp;
}
}
}while(increment > 1);
return arr;
}
5.归并排序
采用了分而治之的思想,将序列看做左右两边,利用递归方法对左右两边排序,最终合并为一个有序序列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
44int* merger_sort(int arr[], int len){
if(len < 2){
return arr;
}
int middle = len / 2;
int* left;
int* right;
for(int i = 0;i < len - 1;i++){
if(i < middle){
left[i] = arr[i];
}else{
right[i - middle] = arr[i];
}
}
return merge(merger_sort(left, middle), merger_sort(right, len - middle), middle, len - middle);
}
int *merge(int* left, int* right,int llen, int rlen){
int i = 0;
int j = 0;
int k = 0;
int* result;
while(i <= llen - 1 && j <= rlen - 1){
if(left[i] <= right[j]){
result[k] = left[i];
i++;
}else{
result[k] = right[j];
j++;
}
k++;
}
while(i <= llen - 1){
result[k] = left[i];
i++;
k++;
}
while(j < rlen - 1){
result[k] = right[j];
j++;
k++;
}
return result;
}