直接插入排序
(一)简介:
是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。
(二)时间空间复杂度
O(n^2)
O(1)
(三)实现思路
保证当前数据有序,依次插入新的数据,让新的数据序列也有序。
(四)C++实现
github链接:https://github.com/KamSss/Sorting-algorithm/blob/master/插入排序/插入排序/test.cc
#include<iostream>
#include<algorithm>
using namespace std;
void InsertionSort(int *arr, int len){
if (arr == NULL)
return;
if (len <= 1)
return;
for (int i = 0; i < len - 1; i++){
for (int j = i; j >= 0; j--){
if (arr[j] > arr[j + 1])
swap(arr[j], arr[j + 1]);
//来到else说明到这个位置已经有序了,所以break
else{
break;
}
}
}
}
int main(){
int arr[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
int len = 10;
InsertionSort(arr, len);
for (size_t i = 0; i < 10; i++){
cout << arr[i];
}
system("pause");
return 0;
}
希尔排序
(一)简介:
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。
(二)时间、空间复杂度:
O(n^(1.3—2)):最好1.3次方最坏平方(插排)
O(1)
(三)实现思路
1.对当前数据按照一定的增量分组,增量的大小在工程上的习惯是gap = ( len / 3) + 1。
2.对划分出的每一组分别进行直接插入排序,使得当前数据逐渐贴近有序。
3.把增量变小,重复前两个步骤。
4.当增量减小到1之后,希尔排序就完成了。
(四)C++实现
Github链接:https://github.com/KamSss/Sorting-algorithm/tree/master/希尔排序
#include<iostream>
#include<algorithm>
using namespace std;
void ShellSort(int *arr, int len){
//gap 表示间隔的大小是多少
for (int gap = (len / 3) + 1; gap >= 1; (gap /= 3) + 1){
//group 表示当前在排序的是第几组 比如10个数gap等于5就一共5组
for (int group = 0; group < gap; group++){
//下面两个循环是对当前这个小组进行直接插入排序
for (int i = group; i + gap < len; i += gap){
for (int t = i; t >= group; t -= gap){
if (arr[t] > arr[t + gap])
swap(arr[t], arr[t + gap]);
else
break;
}
}
}
}
return;
}
int main(){
int arr[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
int len = 10;
ShellSort(arr, len);
for (int i = 0; i < 10; i++){
cout << arr[i];
}
system("pause");
return 0;
}