数据结构---插入排序(直接插入排序和希尔排序)

直接插入排序
基本思想:直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一 个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。也许我们都玩过了扑克牌,我们玩扑克牌的时候我们就是使用的我们的直接插入排序,从最开始我们手里没有数据的时候,到拿到数据的时候插入到合适位置。
数据结构---插入排序(直接插入排序和希尔排序)_第1张图片就像上图一样,每次往后找一个数,并将这个数字插入到我们的有序数列中,知道最后一个我们可以实现我们的排序功能。

#include 
using namespace std;
void Swap(int arr[], int a, int b){
	int temp = arr[a];
	arr[a] = arr[b];
	arr[b] = temp;
}
void insertSort(int array[], int size){
	for (int i = 0; i < size; i++){
		for (int j = 0; j < i; j++){
			if (array[j]>array[i]){
				int ret = array[i];
				for (int x = i; x>j; x--){
					array[x] = array[x - 1];
				}
				array[j] = ret;
				break;
			}
		}
	}
}
void printSort(int array[], int size){
	for (int i = 0; i < size; i++){
		cout << array[i] << " ";
	}
	cout << endl;
}
int main(){
	int arr[] = { 5, 6, 8, 9, 5, 4, 2, 3, 1, 6 };
	int size = sizeof(arr) / sizeof(arr[0]);
	insertSort(arr, size);
	printSort(arr, size);

	system("pause");
	return EXIT_SUCCESS;
}

可以看出我们的插入排序主要是在我们找到需要插入的位置,大量的消耗浪费在了我们移动元素。
插入排序特性:

  • 时间复杂度

     - 最好:O(N)
     - 最坏:O(n^2)
     - 平均:O(n^2)
    
  • 空间复杂度
    - O(1)

  • 稳定性
    - 稳定

思考:我们如何去改进我们的直接插入排序呢?
从上面我们可以看出直接插入排序最好的情况下可以让时间复杂度达到O(N),所以我们尽量保证我们数据的有序,就可以让直接插入排序时间复杂度达到很低,也就是我们将要讲解的希尔排序

希尔排序
希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个 组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工 作。当到达=1时,所有记录在统一组内排好序。
希尔排序就是将我们的直接插入排序进行划分,有间隔的进行我们的直接插入排序,直到我们最后间距达到1的时候我们就可以得到一个有序的数组。
数据结构---插入排序(直接插入排序和希尔排序)_第2张图片就像上图类似,我们首先按照4的间隔进行我们的直接插入排序,第二次让间隔为2再次进行我们的直接插入排序,最后达到1的时候我们排序完之后就得到了一个有序的数组。

#include 
using namespace std;
void Swap(int arr[], int a, int b){
	int temp = arr[a];
	arr[a] = arr[b];
	arr[b] = temp;
}
void InsertSortGrap(int array[], int size, int grap){
	//对相隔grap的值进行插入排序
	for (int i = 0; i < size; i++){
		int key = array[i];
		int j = 0;
		for (j = i - grap; i >= 0 && array[j]>key; j -= grap){
			array[j + grap] = array[j];
		}
		array[j + grap] = key;
	}
}
void shellSort(int array[], int size){
	int grap = size;
	while (1){
		grap = grap / 3 + 1;
		InsertSortGrap(array, size, grap);
		if (grap == 1){
			break;//到1的时候我们就排序排好了
		}
	}
}
void printSort(int array[], int size){
	for (int i = 0; i < size; i++){
		cout << array[i] << " ";
	}
	cout << endl;
}
int main(){
	int arr[] = { 5, 6, 8, 9, 5, 4, 2, 3, 1, 6 };
	int size = sizeof(arr) / sizeof(arr[0]);
	shellSort(arr, size);
	printSort(arr, size);

	system("pause");
	return EXIT_SUCCESS;
}


希尔排序特性:

  • 时间复杂度
    - 最好情况O(n^1.3)
    - 最坏情况O(n^2)
    - 平均情况O(nlogn)~O(n^2)
  • 空间复杂度
    - O(1)
  • 稳定度
    - 不稳定

你可能感兴趣的:(数据结构)