常见排序算法——插入排序(希尔排序、直接插入排序)

直接插入排序

(一)简介:
是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增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;
}

猜你喜欢

转载自blog.csdn.net/qq_42685588/article/details/97634573