四种插入排序说明

宏定义如下:

#include<iostream>
using namespace std;

#define M 21

typedef int SqList[M];

一.直接插入排序

实现代码如下:

void InsertSort(SqList &L,int n)//直接插入排序
{
	for(int i = 2;i < n;++i)    //从下标为2处开始处理
	{
		if(L[i] <= L[i-1])
		{
			L[0] = L[i];        //标兵位
			for(int j = i-1;L[0] < L[j];--j)//向后移位
			{
				L[j+1] = L[j];
			}
			L[j+1] = L[0];      //赋值
		}
	}
}

测试函数实现如下:

void main()
{
	SqList sq = {0,13,24,35,56,32,78,99};//有标兵位
	for(int i = 1;i < 8; ++i)            //打印sq
	{
		cout<<sq[i]<<" ";
	}
	cout<<endl;
	InsertSort(sq,8);                    //直接插入排序结果打印
	for(i = 1;i < 8; ++i)
	{
		cout<<sq[i]<<" ";
	}
	cout<<endl;
}

二.折半插入排序

实现代码如下:

void BInsertSort(SqList &L,int n)//折半插入排序
{
	for(int i = 2;i < n;++i)     //从下标为2处开始处理
	{
		L[0] = L[i];             //标兵位
		int low = 1;             //低位
		int high = i-1;          //高位
		int mid;                 //中间值
		while(low <= high)       //比较条件
		{
			mid = (low+high)/2;  //mid值
			if(L[0] <= L[mid])   //判断
			{
				high = mid - 1;
			}
			else
			{
				low = mid + 1;
			}
		}
		for(int j = i-1;j >= high+1;--j)//向后移位
		{
			L[j+1] = L[j];
		}
		L[high+1] = L[0];               //赋值
	}
}

测试函数实现如下:

void main()
{
	SqList sq = {0,13,24,35,56,32,78,99};//有标兵位
	for(int i = 1;i < 8; ++i)            //打印sq
	{
		cout<<sq[i]<<" ";
	}
	cout<<endl;
	BInsertSort(sq,8);                   //折半插入排序结果打印
	for(i = 1;i < 8; ++i)
	{
		cout<<sq[i]<<" ";
	}
	cout<<endl;
}

三.2—路插入排序

实现代码如下:

void TWayInsertSort(SqList &L,int n)//2—路插入排序
{
	SqList T;
	T[0] = L[0];
	int first;
	int last;
	first = last = 0;
	for(int i = 1;i < n;++i)
	{
		if(L[i] < T[first])
		{
			first = (first-1+n)%n;
			T[first] = L[i];
		}
		else if(L[i] > T[last])
		{
			last++;
			T[last] = L[i];
		}
		else
		{
			last++;
			T[last] = T[last-1];
			for(int j = last-1;L[i] < T[(j-1+n)%n];j = (j-1+n)%n)
			{
				T[j] = T[(j-1+n)%n];
			}
			T[j] = L[i];
		}
	}
	for(i = 0;i < n; ++i)
	{
		L[i] = T[first];
		first = (first+1)%n;
	}
}

测试函数实现如下:

void main()
{
	SqList sq2 = {13,24,35,56,32,78,99}; //无标兵位
	for(i = 0;i < 7; ++i)                //打印sq2
	{
		cout<<sq2[i]<<" ";
	}
	cout<<endl;
	TWayInsertSort(sq2,7);               //2—路插入排序结果打印
	for(i = 0;i < 7; ++i)
	{
		cout<<sq2[i]<<" ";
	}
	cout<<endl;
}

四.希尔排序

实现代码如下:

void ShellInsert(SqList &L,int n,int dk)//希尔插入
{
	for(int i = dk+1;i < n;++i)         //按增量值插入
	{
		if(L[i] < L[i-dk])              //比较大小
		{
		   	L[0] = L[i];                //空闲单元
			for(int j = i - dk;j>1&&L[0]<L[j];j -= dk)//组内插入排序
			{
				L[j+dk] = L[j];
			}
			L[j+dk] = L[0];             //赋值
		}
	}
}

void ShellSort(SqList &L,int n,int dlta[],int t)//希尔排序
{
	for(int k = 0;k < t;++k)                    //按照增量数组值重复插入排序
	{
		ShellInsert(L,n,dlta[k]);
	}
}

测试函数实现如下:

void main()
{
	SqList sq = {0,13,24,35,56,32,78,99};//有标兵位
	for(int i = 1;i < 8; ++i)            //打印sq
	{
		cout<<sq[i]<<" ";
	}
	cout<<endl;
	int dlta[] = {5,3,2,1};             //增量数组
	ShellSort(sq,8,dlta,sizeof(dlta)/sizeof(int));//希尔排序结果打印
	for(i = 1;i < 8; ++i)
	{
		cout<<sq[i]<<" ";
	}
	cout<<endl;
}

如果有没有考虑到的地方希望大家指出,谢谢~

完整的函数及测试如下:

#include<iostream>
using namespace std;

#define M 21

typedef int SqList[M];

void InsertSort(SqList &L,int n)//直接插入排序
{
	for(int i = 2;i < n;++i)    //从下标为2处开始处理
	{
		if(L[i] <= L[i-1])
		{
			L[0] = L[i];        //标兵位
			for(int j = i-1;L[0] < L[j];--j)//向后移位
			{
				L[j+1] = L[j];
			}
			L[j+1] = L[0];      //赋值
		}
	}
}

void BInsertSort(SqList &L,int n)//折半插入排序
{
	for(int i = 2;i < n;++i)     //从下标为2处开始处理
	{
		L[0] = L[i];             //标兵位
		int low = 1;             //低位
		int high = i-1;          //高位
		int mid;                 //中间值
		while(low <= high)       //比较条件
		{
			mid = (low+high)/2;  //mid值
			if(L[0] <= L[mid])   //判断
			{
				high = mid - 1;
			}
			else
			{
				low = mid + 1;
			}
		}
		for(int j = i-1;j >= high+1;--j)//向后移位
		{
			L[j+1] = L[j];
		}
		L[high+1] = L[0];               //赋值
	}
}

void TWayInsertSort(SqList &L,int n)//2—路插入排序
{
	SqList T;
	T[0] = L[0];
	int first;
	int last;
	first = last = 0;
	for(int i = 1;i < n;++i)
	{
		if(L[i] < T[first])
		{
			first = (first-1+n)%n;
			T[first] = L[i];
		}
		else if(L[i] > T[last])
		{
			last++;
			T[last] = L[i];
		}
		else
		{
			last++;
			T[last] = T[last-1];
			for(int j = last-1;L[i] < T[(j-1+n)%n];j = (j-1+n)%n)
			{
				T[j] = T[(j-1+n)%n];
			}
			T[j] = L[i];
		}
	}
	for(i = 0;i < n; ++i)
	{
		L[i] = T[first];
		first = (first+1)%n;
	}
}

void ShellInsert(SqList &L,int n,int dk)//希尔插入
{
	for(int i = dk+1;i < n;++i)         //按增量值插入
	{
		if(L[i] < L[i-dk])              //比较大小
		{
			L[0] = L[i];                //空闲单元
			for(int j = i - dk;j>1&&L[0]<L[j];j -= dk)//组内插入排序
			{
				L[j+dk] = L[j];
			}
			L[j+dk] = L[0];             //赋值
		}
	}
}

void ShellSort(SqList &L,int n,int dlta[],int t)//希尔排序
{
	for(int k = 0;k < t;++k)                    //按照增量数组值重复插入排序
	{
		ShellInsert(L,n,dlta[k]);
	}
}

void main()
{
	SqList sq = {0,13,24,35,56,32,78,99};//有标兵位
	for(int i = 1;i < 8; ++i)            //打印sq
	{
		cout<<sq[i]<<" ";
	}
	cout<<endl;
	SqList sq2 = {13,24,35,56,32,78,99}; //无标兵位
	for(i = 0;i < 7; ++i)                //打印sq2
	{
		cout<<sq2[i]<<" ";
	}
	cout<<endl;

	InsertSort(sq,8);                    //直接插入排序结果打印
	for(i = 1;i < 8; ++i)
	{
		cout<<sq[i]<<" ";
	}
	cout<<endl;
	BInsertSort(sq,8);                   //折半插入排序结果打印
	for(i = 1;i < 8; ++i)
	{
		cout<<sq[i]<<" ";
	}
	cout<<endl;
	TWayInsertSort(sq2,7);               //2—路插入排序结果打印
	for(i = 0;i < 7; ++i)
	{
		cout<<sq2[i]<<" ";
	}
	cout<<endl;
	int dlta[] = {5,3,2,1};             //增量数组
	ShellSort(sq,8,dlta,sizeof(dlta)/sizeof(int));//希尔排序结果打印
	for(i = 1;i < 8; ++i)
	{
		cout<<sq[i]<<" ";
	}
	cout<<endl;
}
时间: 2024-10-09 17:42:17

四种插入排序说明的相关文章

PHP四种基础算法详解

许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的. 需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序. $arr=array(11,3,56,62,21,66,32,78,36,76,39,88,34); 1.冒泡排序 介绍: 冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排

php四种基础算法:冒泡,选择,插入和快速排序法

转自:http://www.php100.com/html/php/rumen/2013/1029/6333.html 许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的.下面是我按自己的理解,将四个方法分析一遍. 需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序. $arr(1,43,5

笔试算法题(53):四种基本排序方法的性能特征(Selection,Insertion,Bubble,Shell)

四种基本算法概述: 基本排序:选择,插入,冒泡,希尔.上述算法适用于小规模文件和特殊文件的排序,并不适合大规模随机排序的文件.前三种算法的执行时间与N2成正比,希尔算法的执行时间与N3/2(或更快)成正比: 前三种算法在平均,最坏情况下都是N2,而且都不需要额外的内存:所以尽管他们的运行时间只相差常数倍,但运行方式不同: 对于已经就序的序列而言,插入排序和冒泡排序的运行时间都是O(N),但是选择排序的时间仍旧是O(N^2): 因为Insertion和Bubble都是相邻项间的比较交换,所以不会出

四种排序算法PHP实现类

四种排序算法的PHP实现:1) 插入排序(Insertion Sort)的基本思想是: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止. 2) 选择排序(Selection Sort)的基本思想是: 每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕. 3) 冒泡排序的基本思想是: 两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止. 4) 快速排序实质上和

JAVA中运用数组的四种排序方法

JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法. 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来. 选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组. 插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序.下面我就将他们的实现方法一一详解供大家参考. <1>利用Arrays带有的排序方法快

php四种基础算法:冒泡,选择,插入和快速排序法PHP基础教程

许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西.但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的.下面兄弟连PHP培训 小编将四个方法分析一遍. 需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序. $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序法 * 思路分析:法如其名,就是像冒泡一样,每次

php四种基础排序算法的运行时间比较!

/** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 function bubbleSort($array){ $temp = 0; for($i = 0;$i < count($array) -1;$i++){ for($j = 0;$j < count($array) - 1 -$i;$j++){ if($array[$j] > $arra

四种简单的排序算法

我觉得如果想成为一名优秀的开发者,不仅要积极学习时下流行的新技术,比如WCF.Asp.Net MVC.AJAX等,熟练应用一些已经比较成熟的技术,比如Asp.Net.WinForm.还应该有着牢固的计算机基础知识,比如数据结构.操作系统.编译原理.网络与数据通信等.有的朋友可能觉得这方面的东西过于艰深和理论化,望而却步,但我觉得假日里花上一个下午的时间,研究一种算法或者一种数据结构,然后写写心得,难道不是一件乐事么?所以,我打算将一些常见的数据结构和算法总结一下,不一定要集中一段时间花费很大精力

java四种数组排序

数组的四种排序 1.快速排序法Arrays.sort(); 用法1.sort(byte[] a) 对指定的 byte 型数组按数字升序进行排序. sort(byte[] a, int fromIndex, int toIndex) 对指定 byte 型数组的指定范围按数字升序进行排序. sort(char[] a) 对指定的 char 型数组按数字升序进行排序. sort(char[] a, int fromIndex, int toIndex) 对指定 char 型数组的指定范围按数字升序进行