插入类排序:直插,折半插,希尔

插入类排序:
1:直接插入排序O(n^2)
2:折半插入排序O(n^2)
3:希尔排序    O(n乘以log以2为底,n的对数)
空间复杂度都是O(1)

//直接插入排序
void InsertSort(int R[],int n)
{
	int i,j;
	int tmp;
	for(i=1;i<n;i++)//数组下标从0开始,第一个有序,所以从1开始
	{
		tmp=R[i];
		j=i-1;
		while(j>=0 && tmp<R[j])//元素右移,以便插入
		{
			R[j+1]=R[j];
			j--;
		}
		R[j+1]=tmp;
	}
}

//折半插入排序(有序表中进行查找和插入)
void InsertSort1(int R[],int n)
{
	int i,j,low,high,mid;
	int tmp;
	for(i=1;i<n;i++)//每个元素向前面排序好的插入
	{
		tmp=R[i];
		low=0;high=i-1;
		while(low<=high)//找位置
		{
			mid=(low+high)/2;
			if(tmp<R[mid])
				high=mid-1;
			else
				low=mid+1;
		}
		for(j=i-1;j>=high+1;j--)//向后移动
			R[j+1]=R[j];
		R[high+1]=tmp;
	}
}

//希尔排序(缩小增量排序,内部还是使用直接插入排序)
void ShellSort(int R[],int n)
{
	int i,j,gap;
	int tmp;
	gap=n/2;
	while(gap>0)
	{
		for(i=gap;i<n;i++)//对后面每一个都进行gap直接插入测试
		{
			tmp=R[i];
			j=i-gap;
			while(j>=0 && tmp<R[j])
			{
				R[j+gap]=R[j];
				j=j-gap;
			}
			R[j+gap]=tmp;
		}
		gap=gap/2;
	}
}

时间: 2024-10-08 17:00:15

插入类排序:直插,折半插,希尔的相关文章

数据结构与算法——插入类排序(直接插入排序,希尔排序)

一.直接插入排序 对于一个有序的序列,不断将后面的元素插入前面的有序序列,保持序列继续有序. 对于直接插入排序的思路:将要排序的元素保存,然后逐个和其前面的元素进行比较,如果前面的元素比其大,则将前面的元素后移一个. 时间复杂度为n*n void insert_sort(int a[],int n) { int i,j; int temp; for(i=1;i<n;i++) { temp = a[i]; j=i-1; while((j>=0)&& (temp<a[j]))

详谈排序算法之插入类排序(两种思路实现希尔排序)

1. 排序( sorting) 的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.其确切的定义为: 假设有n个数据元素的序列{R1 , R2 , - , Rn},其相应关键字的序列是{K1 , K2 , - , Kn} ,通过排序要求找出下标 1 , 2 , - , n的一种排列p1 , p2 , - , pn,使得相应关键字满足如下的非递减(或非递增)关系Kp1 ≤ Kp2 ≤ - ≤ Kpn这样,就得到一个按关键字有序的纪录序列{ Rp1 , Rp2 , - , Rpn }

数据结构之排序算法Java实现(6)—— 插入类排序之折半插入排序算法

折半插入排序是对直接插入排序进行了改进,在寻找插入点时使用二分查找算法,提高了查询效率. 升序排序: /** * 折半插入排序 * 升序排序 */ @Override public <T extends Comparable<? super T>> void sortByAsc(T[] data) { for(int i = 1;i < data.length;i++ ){ if(data[i].compareTo(data[i - 1]) < 0){ /**记录i的值

插入类排序(直接插入排序)

1.直接插入排序 1)时间复杂度:T(n)=O(n^2); 2)空间复杂度:S(n)=O(1);             3)简介:直接插入排序是一种最基本的插入排序方法,直接插入排序(Straight Insertion Sorting)的基本思想是把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程 中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程.把a[i]插入到a[0

插入类的排序算法

#include<stdio.h> /* * 插入排序算法 每天一道算法题 */ void traverseArray(int *p,int length) { int i=0; for(;i<length;i++) { printf("%d\n",p[i]); } } //直接插入排序 void insertSorted(int *p,int length) { int i,j,temp; for(i=1;i<length;i++) { if(p[i]<

详谈排序算法之选择类排序(两种方法实现堆排序)

   今天我们再来讨论一下选择类排序,选择类排序分为:简单排序,树形选择排序和堆排序.但我们主要说的是简单和堆排序两个,因为树形选择排序使用了较多的辅助空间,以及和∞进行多余比较,为弥补树型选择排序的这些缺点, J.W.J.Williams 在 1964 年提出了进一步的改进方法,即堆排序.对于我个人而言..一开始并不是很理解它的算法思想,纠结了许久.在网上查找资料的时候发现这位大神的文章思路十分清晰,而且把创建堆以及堆化数组的算法讲解的十分详细.如果有不明白堆排序思路的,可以先看看这篇文章~堆

常见的五类排序算法图解和实现(多关键字排序:基数排序以及各个排序算法的总结)

基数排序思想 完全不同于以前的排序算法,可以说,基数排序也叫做多关键字排序,基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法. 两种方式: 1.最高位优先,先按照最高位排成若干子序列,再对子序列按照次高位排序 2.最低位优先:不必分子序列,每次排序全体元素都参与,不比较,而是通过分配+收集的方式. 多关键字排序 例:将下表所示的学生成绩单按数学成绩的等级由高到低排序,数学成绩相同的学生再按英语成绩的高低等级排序.        第一个关键字是数学成绩,第二个关键字是英

排序算法总结----比较类排序

概述:排序算法可分为比较性的排序,以及运算性的排序:这里详细介绍这些排序的原理,性能,实现,以及应用场合. 前面是维基百科的介绍,这里介绍几个比较典型的算法. 理论 计算复杂性理论 大O符号 全序关系 列表 稳定性 比较排序 自适应排序 排序网络 整数排序 交换排序 冒泡排序 鸡尾酒排序 奇偶排序 梳排序 侏儒排序 快速排序 臭皮匠排序 Bogo排序 选择排序 选择排序 堆排序 Smooth排序 笛卡尔树排序 锦标赛排序 循环排序 插入排序 插入排序 希尔排序 二叉查找树排序 图书馆排序 Pat

【数据结构与算法】内部排序之一:插入排序和希尔排序的N中实现(不断优化,附完整源码)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/20043459   前言 本来想将所有的内部排序总结为一篇博文,但是随着研究的深入,还是放弃了这个念头,斟前酌后,还是觉得分开来写比较好,具体原因,看完本篇博文也就自然明了了. 本篇文章主要探讨插入排序和希尔排序,之所将二者放在一起,很明显,是因为希尔排序是建立在插入排序的基础之上的.     注:以下各排序算法的N种实现方法大部分都是我根据算法思想,自己写出来的,或者是参考其本身的经典实