插入排序(直接插入排序,折半插入排序,希尔排序)

直接插入排序算法思想:从第二个元素开始,依次将后面元素插入前面已经排序好的序列。

折半插入排序算法思想:从第二个元素开始,依次将后面元素插入前面已经排序好的序列(与直接插入排序不同的是寻找插入位置使用的是折半查找,先找到待插入位置,再统一后移元素,最后将待插入元素放到合适位置)。

希尔排序算法思想:先将待排序元素按照增量分成若干子表,对各个子表分别进行直接插入排序,当整个表中元素基本有序之后,再对全体元素进行一次直接插入排序。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int ElemType;
typedef struct SeqList {
	ElemType* data;
	int length;
}SeqList;
//直接插入排序算法思想:从第二个元素开始,依次将后面元素插入前面已经排序好的序列
void DirectInsertSort(SeqList L) {//直接插入排序
	for (int i = 1; i < L.length; i++) {
		int e = L.data[i];//保存待插入元素
		int cur = i - 1;
		while (L.data[cur] > e&&cur>=0) {//寻找插入位置
			L.data[cur + 1] = L.data[cur];
			cur -= 1;
		}
		L.data[cur + 1] = e;//while循环结束后L.data[cur]<e,故将e插入到L.data[cur + 1]位置
	}
}
//折半插入排序算法思想:从第二个元素开始,依次将后面元素插入前面已经排序好的序列
//(与直接插入排序不同的是寻找插入位置使用的是折半查找,先找到待插入位置,再统一后移元素,最后将待插入元素放到合适位置)
void HalfInsertSort(SeqList L) {
	for (int i = 1; i < L.length; i++) {
		int e = L.data[i];
		int cur = i - 1;
		int low = 0, high = cur, mid = (low + high) / 2;
		while (low <= high) {//折半查找,最后待插入位置为low指向位置
			mid = (low + high) / 2;
			if (L.data[mid] > e) {
				high = mid - 1;
			}
			else if (L.data[mid] < e) {
				low = mid + 1;
			}
		}
		for (int j = cur; j >= low; j--) {//统一后移元素
			L.data[j + 1] = L.data[j];
		}
		L.data[low] = e;//将待插入元素放到合适位置
	}
}
/*希尔排序算法思想:先将待排序元素按照增量分成若干子表,对各个子表分别进行直接插入排序,当整个表中元素基本有序之后,再对全体元素进行一次直接插入排序*/
void ShellSort(SeqList L) {
	for (int dk = L.length / 2; dk >= 1; dk /= 2)//步长变化
	{
		for (int i = dk; i < L.length; i += dk) {//对每组元素进行直接插入排序
			int e = L.data[i];//保存待插入元素
			int cur = i - dk;
			while (L.data[cur] > e && cur >= 0) {//寻找待插入位置
				L.data[cur + dk] = L.data[cur];
				cur -= dk;
			}
			L.data[cur + dk] = e;将待插入元素放到合适位置
		}
	}
}
int main() {
	int len;
	scanf("%d", &len);
	SeqList L;
	L.length = len;
	L.data = (ElemType*)malloc(sizeof(ElemType)*len);
	for (int i = 0; i < len; i++) {
		scanf("%d", &L.data[i]);
	}
	//DirectInsertSort(L);//直接插入排序
	//HalfInsertSort(L);//折半插入排序
	ShellSort(L);
	for (int i = 0; i < L.length; i++) {
		printf("%d ", L.data[i]);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值