首页 > 其他分享 >插入排序(直接插入,折半插入,希尔排序)

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

时间:2022-12-17 17:34:25浏览次数:61  
标签:折半 int ElemType 直接插入 gap ST 插入排序

学习时间2022.12.17

插入排序

基本概念

直接插入排序

  • 要理解直接插入排序看这篇解学武插入排序算法及C语言实现
  • 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
  • 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
  • 示意图
    直接插入排序

折半插入排序

  • 要理解折半插入排序看这篇解学武折半插入排序算法(折半排序算法)
  • 折半插入排序,是在直接插入排序的基础上进行的。直接插入排序把数组分为了已排序和待插入两部分,折半插入排序是在已排序的数组中进行折半查找操作,找到最新要插入元素应该在的位置。

希尔排序

代码实现

基本数据结构

typedef int ElemType;

typedef struct {
	ElemType* elem;//整型指针
	int TableLen;//动态数组元素个数
}SSTable;

基本函数实现

void ST_init(SSTable& ST, int len) {
	ST.TableLen = len + 1;//多申请一个空间,第一个空间用于存储插入排序时要交换的元素值,因为下标在变化,不使用哨兵的话代码会更复杂一些
	//ST.elem = (ElemType*)malloc(sizeof(ElemType) * ST.TableLen);
	ST.elem = (ElemType*)calloc(ST.TableLen, sizeof(ElemType));
	//初始化随机数发生器
	srand(time(NULL));
	//输出0-100的ST.TableLen个随机数
	for (int i = 0; i < ST.TableLen; i++)
	{
		ST.elem[i] = rand() % 100;
	}
}

void swap(ElemType& a, ElemType& b) {
	int temp;
	temp = a;
	a = b;
	b = temp;
}

void ST_print(SSTable ST) {
	for (int i = 0; i < ST.TableLen; i++) {
		printf("%3d", ST.elem[i]);
	}
	printf("\n");
}

直接插入排序和对应main函数

//直接插入排序
void InsertSort(ElemType A[], int n) {
	int i, j;
	for (i = 2; i <= n; i++)
	{
		if (A[i] < A[i - 1])
		{
			A[0] = A[i];
			for (j = i - 1; A[0] < A[j]; j--)
			{
				A[j + 1] = A[j];
			}
			A[j+1] = A[0];
		}
	}
}

int main() {
	SSTable ST;
	ST_init(ST, 10);
	ElemType A[] = { 32,45,11,324,32,59,90,85,1,49 };
	//memcpy(ST.elem, A, sizeof(A));
	ST_print(ST);
	InsertSort(ST.elem, 10);
	ST_print(ST);
}

折半插入排序和对应main函数

//折半插入排序
void MidInsertSort(ElemType A[], int n) {
	int low, high, mid, i, j, temp;
	for (i = 2; i <= n; i++)
	{
		low = 1;
		high = i - 1;
		temp = A[i];
		while (low <= high)
		{
			mid = (low + high) / 2;
			if (temp < A[mid])
			{
				high = mid - 1;
			}
			else
			{
				low = mid + 1;
			}
		}
		for (j = i; j > low; j--)
		{
			A[j] = A[j - 1];
		}
		A[low] = temp;
	}
}
int main() {
	SSTable ST;
	ST_init(ST, 10);
	ElemType A[] = { 32,45,11,324,32,59,90,85,1,49 };
	//memcpy(ST.elem, A, sizeof(A));
	ST_print(ST);
	MidInsertSort(ST.elem, 10);
	ST_print(ST);
}

希尔排序和对应main函数

//希尔排序(交换法)
void ShellSort1(ElemType A[], int n) {
	int gap,i;
	for (gap = n / 2; gap >= 1; gap /= 2)
	{
		for (i = gap + 1; i <= n; i++)
		{
			int j = i;
			while (j - gap >= 1 && A[j] < A[j - gap])
			{
				swap(A[j], A[j - gap]);
				j -= gap;
			}
			
		}
	}
}

//希尔排序(移动法)
void ShellSort2(ElemType A[], int n) {
	int gap, i;
	for (gap = n / 2; gap >= 1; gap /= 2)
	{
		for (i = gap + 1; i <= n; i++)
		{
			int j = i;
			int temp = A[j];
			while (j - gap >= 1 && temp < A[j - gap])
			{
				A[j] = A[j - gap];
				j -= gap;
			}
			A[j] = temp;
		}
	}
}

int main() {
	SSTable ST;
	ST_init(ST, 10);
	ElemType A[] = { 32,45,11,324,32,59,90,85,1,49 };
	//memcpy(ST.elem, A, sizeof(A));
	ST_print(ST);
	ShellSort2(ST.elem, 10);
	ST_print(ST);
}

标签:折半,int,ElemType,直接插入,gap,ST,插入排序
From: https://www.cnblogs.com/ayubene/p/16989236.html

相关文章

  • 数据结构之 插入排序
    插入排序:包括:​​直接插入排序​​,二分插入排序(又称折半插入排序),链表插入排序,​​希尔排序​​(又称缩小增量排序)。插入排序算法思路假定这个​​数组​​的序是排好的,......
  • 直接插入排序 && 折半插入排序 && 希尔排序
    插入排序&&折半插入排序&&希尔排序:(一)插入排序:(1)代码实现:voidinsertSort(int*array,intn){inttemp;inti,j;for(i=1;i<n;i++){if(array[i]<array[i-1])......
  • 直接插入排序
    排序是非常常见且常用的算法,这次的排序算法是直接插入排序见例题如下:本题要求实现直接插入排序函数,待排序列的长度1<=n<=1000。函数接口定义:voidInsertSort(SqListL......
  • 5、顺序表查找:顺序查找与折半查找
    1、顺序查找按照顺序一个一个比较,查找需要的值。代码实现:时间复杂度:T(n)=O(n)空间复杂度:S(n)=O(1)staticintfindKey(int[]arr,intobj){for(int......
  • 三种基本排序方法之选择排序、冒泡排序、插入排序
    前言三种最基本的排序方法:选择排序、冒泡排序、插入排序。这些排序并不是学习数据结构时才碰到的,早在学习C++时教材上就有介绍。现在正在学习数据结构,复习并且自己动手实......
  • golang的插入排序算法
    1、什么是插入排序?先看一个例子:{7,6,1,9,3}无序数列中,我们约定好无序数列的第一个元素7作为有序数列{7},然后分别对{6,1,9,3}的数与7进行比较移位得到新的有序数列。第一次迭......
  • 利用直接插入排序进行将数组序列从小到大排序
    1题目功能:直接插入排序描述:利用直接插入排序进行将数组序列从小到大排序2思路原始顺序:34,12,45,3,8,23,89,52,24,10在代码中将数组a[0]置为监视哨......
  • 插入排序之直接插入排序,折半插入,希尔排序详解和特点
    插入排序引申了三种:直接插入排序,折半插入排序,希尔排序一、直接插入排序直接插入排序排序方法: 1、查找出L(i)在L[1……i-1]中的位置k。2、将L[k……i-1]所有元素全部后移......
  • [排序算法] 2路插入排序 (C++)
    前言本文章是建立在插入排序的基础上写的,如果还有不懂插入排序的童鞋先停下脚步,可以先看看这里~❤❤❤直接/折半插入排序2路插入排序解释在插入排序中,当待插入......
  • 算法-2 选择排序、冒泡排序、插入排序
    一选择排序选择排序的时间复杂度O(n2),额外空间复杂度O(1)publicstaticvoidSelectionSort(int[]arr){if(arr==null||arr.Length<2){ret......