数据结构--直接插入排序与希尔排序

1 插入排序

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键字码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。

2 直接插入排序

2.1 基本思想

当插入第 i ( i > = 1 ) i(i>=1) i(i>=1)个元素时,前面的array[0]、array[1]、…、array[i-1]已经排好序,此时用array[i]的排序码与array[i-1]、array[i-2]、…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移。

2.2 算法示意图

在这里插入图片描述

2.3 程序代码

#include<stdio.h>
#include<stdlib.h>
/*直接插入排序
*/
void insertSort(int* arr, int n) {
	//假设第一个数据有序
	//未插入的数据[1,n)
	for (int i = 1; i < n; i++) {
		int end = i - 1;
		int data = arr[i];
		while (end >= 0 && arr[end] > data) {
			//大的数据向后移动
			arr[end + 1] = arr[end];
			end--;
		}
		arr[end + 1] = data;
	}
}

2.4 代码验证


void testInsertSort() {
	int arr[] = { 9 ,1,2,5,7,4,8,6,3,5 };
	int n = sizeof(arr) / sizeof(arr[0]);
	insertSort(arr , n);
	for (int i = 0; i < n; i++) {
		printf("%d ", arr[i]);
	}
}
int main() {
	testInsertSort();
	return 0;
}

运行结果如下:
在这里插入图片描述

2.5 直接插入排序的特性

  • 元素集合越接近有序,直接插入排序算法的时间效率越高
  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( 1 ) O(1) O(1),它是一种稳定的排序算法
  • 稳定性:稳定

3 希尔排序

3.1 基本思想

希尔排序法又称缩小增量法。希尔排序的基本思想是:先选定一个整数n,把待排序文件中所有记录分成n个组,所有距离为n的记录分在同一组内,并对每一组内的记录进行排序。然后,重复上述分组和排序的工作,当n=1时,所有记录在统一组内排好序。

3.2 算法示意图

  • n=3时:
    在这里插入图片描述
  • n=2时:
    在这里插入图片描述
  • n=1时:
    在这里插入图片描述

3.3 程序代码

#include<stdio.h>
#include<stdlib.h>
/*希尔排序
*/
void shellSort(int* arr, int n) {
	int gap = n;
	while (gap > 1) {
		gap = gap / 3 + 1 ;
		//未排序数组[gap , n)
		for (int i = gap; i < n; i++) {
			int end = i - gap;
			int data = arr[i];
			while (end >= 0 && arr[end] > data) {
				arr[end + gap] = arr[end];
				end = end - gap;
			}
			arr[end + gap] = data;
		}
	}
}

3.4 代码验证

void testShellSort() {
	int arr[] = { 9 ,1,2,5,7,4,8,6,3,5 };
	int n = sizeof(arr) / sizeof(arr[0]);
	shellSort(arr, n);
	for (int i = 0; i < n; i++) {
		printf("%d ", arr[i]);
	}
}
int main() {
	testShellSort();
	return 0;
}

3.5 希尔排序的特性

  • 希尔排序是对直接插入排序的优化
  • gap>1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比
  • 希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度: O ( N 1.3 − N 2 ) O(N^{1.3}-N^2) O(N1.3N2)
  • 稳定性:不稳定
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值