IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 直接插入排序算法之表插入排序详解 -> 正文阅读

[数据结构与算法]直接插入排序算法之表插入排序详解

一、算法原理

插入排序属于稳定排序法,是一种常用的排序算法。直接插入排序算法可以利用静态数组来实现,也可以使用静态链表或者单链表来实现。本文给出了直接插入算法的静态链表实现方法,即表插入排序算法。
基于静态链表实现直接插入排序,就是把待排序的数组放入静态链表中,通过修改静态链表中的索引域的值来给出排序结果。该排序方法不改变原数组中元素的位置,只是在索引域中给出其在排序表中位置,因此相比较于直接插入排序算法,本算法不需要移动元素。

下面例子演示了使用单表插入排序算法的过程。
Demo:
假设一组散乱数据:{ 40,30,50,10,20 }
Step 0:创建静态链表,元素0不存储元素,其“Next下标”项表示当前静态链表中最小元素的下标
在这里插入图片描述
Step 1:将元素40存入静态链表下标为1的位置,当前静态链表中最小元素是40,其下标是1,所以元素0的“Next下标”赋值为1,而元素1的“Next下标”值为0,表示其为当前静态数组的最后一个元素。
在这里插入图片描述
Step 2:将元素30存入静态链表下标为2的位置,当前静态链表中最小元素是30,因此修改元素0的“Next下标”为2,修改元素2的“Next下标”为1。
在这里插入图片描述
Step 3:将元素50存入静态链表下标为3的位置,当前静态链表中最小元素是30,最大元素是50,因此修改“Next下标”值如下表所示。
在这里插入图片描述
Step 4:将元素10存入静态链表下标为4的位置,当前静态链表中最小元素是10,因此修改元素0的“Next下标”值为4,其它元素的“Next下标”值如下表所示。
在这里插入图片描述
Step 5:将元素20存入静态链表下标为5的位置,各元素的“Next下标”值如下表所示。
在这里插入图片描述
在这一步中插入元素20时,其是当前静态链表中第二小的元素,因此此处修改其下标及最小元素10的下标时,需要单独处理,也就是需要记录比元素20小的相邻的那个元素的位置,然后将其“Next下标”值赋值为第二小的下标。

二、基于表插入排序算法的C程序

1. 表插入排序算法函数

void TableInsertSort( Table arr[], int length )
{
	int i, k ,loc;
	arr[0].nextInd = 1;
	arr[1].nextInd = 0;
	for( i = 2; i <= length; i++ )
	{
		k = loc = 0;
		while( 1 )
		{
			if( arr[i].data <= arr[ arr[k].nextInd ].data )
			{
				if( k == 0 )
				{
					loc = 0;
				}
				arr[i].nextInd = arr[loc].nextInd;
				arr[loc].nextInd = i;
				break;
			}
			else 
			{
				if( arr[ arr[k].nextInd ].nextInd == 0 )
				{
					arr[ arr[k].nextInd ].nextInd = i;
					arr[i].nextInd = 0;
					break;
				}
				loc = arr[k].nextInd;//记录比当前元素小的元素下标 
				k = arr[ arr[k].nextInd ].nextInd;
			}
		}
	}
}

2.测试代码(仅供参考)

//直接插入排序算法之静态链表实现方法 
#include"stdio.h"
typedef struct tbl
{
	int data;
	int nextInd;
}Table;
void TableInsertSort( Table arr[], int length );
int main()
{
	int i;
	int a[] = { 4, 3, 5, 1, 2 };
	Table arr[6];
	int length = 5;
	for( i = 1; i <= length; i++ )
	{
		arr[i].data    = a[i-1];
		arr[i].nextInd = 0;
	}
	arr[0].data = 0;
	TableInsertSort( arr, length );
	printf( "index  :" );
	for( i = 0; i <= length; i++ )
	{
		printf( "%5d", i );
	} 
	printf( "\n" );
	printf( "data   :" );
	for( i = 0; i <= length; i++ )
	{
		printf( "%5d", arr[i].data );
	} 
	printf( "\n" );
	printf( "nextInd:" );
	for( i = 0; i <= length; i++ )
	{
		printf( "%5d", arr[i].nextInd );
	} 
	printf( "\n" );
	return 0;
}

void TableInsertSort( Table arr[], int length )
{
	int i, k ,loc;
	arr[0].nextInd = 1;
	arr[1].nextInd = 0;
	for( i = 2; i <= length; i++ )
	{
		k = loc = 0;
		while( 1 )
		{
			if( arr[i].data <= arr[ arr[k].nextInd ].data )
			{
				if( k == 0 )
				{
					loc = 0;
				}
				arr[i].nextInd = arr[loc].nextInd;
				arr[loc].nextInd = i;
				break;
			}
			else 
			{
				if( arr[ arr[k].nextInd ].nextInd == 0 )
				{
					arr[ arr[k].nextInd ].nextInd = i;
					arr[i].nextInd = 0;
					break;
				}
				loc = arr[k].nextInd;//记录比当前元素小的元素下标 
				k = arr[ arr[k].nextInd ].nextInd;
			}
		}
	}
}

3.运行结果
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 01:12:58  更:2022-09-30 01:15:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:48:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码