带哨兵的插入排序

插入排序的算法实现

自己在实现带有哨兵的插入排序算法的时候,发现有两种思路:

  • 在内存里面又一次分配一块比输入数组inputArray长度大一的temp数组,空出temp数组的第一个位置。然后把inputArray从第emp数组的第二个位置复制进去。既有temp[i+1]=inputArray[i]。i<arrayLength,再把第一个位置temp[0]赋值一个足够小的数字INT_MIN,以temp[0]为哨兵,进行插入排序。最后再把temp数组从第二个元素(temp[1])開始。又一次拷贝到从第一个元素(inputArray[0])開始的inputArray数组里面,返回。
  • 另外一种方法就是每開始一次输入。就把将要进行插入inputArray[j]的元素赋值给inputArray[0],这样就能够起到一个哨兵的作用,可是这样做须要把inputArray数组第一个元素暂存起来,否则数组的第一个元素会丢失,最后再把inputArray[0]进行插入处理...

以下是两种方案的实现:

第一种实现不是那么灵活

void insertSort(int inputArray[] ,const int arrayLength)
{
	int i,j;
	int tempArray[arrayLength+1];
	//inputArray又一次拷贝到tempArray里面
	for (i = 0; i < arrayLength; ++i)
	{
		tempArray[i+1]=inputArray[i];
	}
	tempArray[0]=INT_MIN;
	//以下開始对带有哨兵的 tempArray进行排序
	for (i = 1; i <= arrayLength; ++i)
	{
		int temp = tempArray[i];
		for (j = i; temp < tempArray[j-1] ; --j)
		{
			tempArray[j]=tempArray[j-1];
		}
		tempArray[j]=temp;
	}
	for (i = 0;i<arrayLength; ++i)
	{
		inputArray[i]=tempArray[i+1];
	}
}

另外一种实现

void insertSort(int inputArray[] , const int arrayLength)
{
	int i,j;
	int tempArray[arrayLength+1];
	//inputArray又一次拷贝到tempArray里面
	for (i = 0; i < arrayLength; ++i)
	{
		tempArray[i+1]=inputArray[i];
	}
	tempArray[0]=INT_MIN;
	//以下開始对带有哨兵的 tempArray进行排序
	for (i = 1; i <= arrayLength; ++i)
	{
		int temp = inputArray[i];
		for (j = i; temp < tempArray[j-1] ; --j)
		{
			tempArray[j]=tempArray[j-1];
		}
		tempArray[j]=temp;
	}
	for (i = 0;i<arrayLength; ++i)
	{
		inputArray[i]=tempArray[i+1];
	}
}

对两个插入排序进行实验:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
void insertSort(int inputArray[],const int arrayLength )
{
	/*...*/
}
void printArray(const int inputArray[],const int arrayLength)
{
	int i;
	for(i=0;i<arrayLength;++i)
	{
		printf("%d\t",inputArray[i] );
	}
}

int main(int argc, char const *argv[])
{
	int i=0;
	srand((int)time(NULL));
	int array[10];
	for(i=0;i<sizeof(array)/4;++i)
	{
		array[i]=rand()%100;
	}
	printArray(array,sizeof(array)/4);
	insertSort(array,sizeof(array)/4);
	printArray(array,sizeof(array)/4);
	return 0;
}

实验结果:

时间: 2024-08-14 04:37:29

带哨兵的插入排序的相关文章

带哨兵的插入排序实现

import sort.Sort; /* * 有哨兵的插入排序 */ public class InsertSortWithSentry extends Sort { @Override public void sort(Comparable[] a) { Comparable min = a[0] ; int minPos = 0 ; for(int i=1 ; i<a.length ; i++) { if(!less(a[i] , a[minPos])) minPos = i ; } Com

直接插入排序(带哨兵和不带哨兵)

前言 插入排序(insertion sort)的基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排序好的序列中,直到全部记录插入完成为止. 直接插入排序 基本思想 假设待排序的记录存放在数组R[1..n]中.初始时,R[1]自成1个有序区,无序区为R[2..n].从i = 2起直到i = n 为止,依次将R[i]插入当前的有序区R[1..i - 1]中,生成含n个记录的有序区. 排序方法 将待插入记录R[i]的关键字从右向左依次与有序区中记录R[j](j=i - 1, i - 2,

算法导论之九(10.2不带哨兵节点和带哨兵节点的双向链表)

不带哨兵节点的双向链表即一般的双向链表,有一个头指针指向第一个节点,每个节点有key值和两个指针next和pre,分别指向前后相邻的节点,头结点的pre=NULL,尾节点的next=NULL,比较明了,但是也有麻烦的地方:在做查找删除节点等操作的时候,免不了要判断边界条件,比如node==NULL等.先来看看这种链表的代码: /* * 实现没有哨兵节点的双向链表,需要自己判断边界条件 */ #include <iostream> using namespace std; class list

链表——哨兵

没有哨兵的链表: ListSearch(L,k) { x = L.head; while(x!=null && x.key!=k) x = x.next; return x;} ListInsert(L,x){ x.next = L.head; if(L.head!=null) L.head.pre = x L.head = x; x.prev = null;} ListDelete(L,x) { if(x.prev!=null) x.prev.next = x.next; else L.

探讨排序算法的实现

排序算法是我们工作中使用最普遍的算法,常见的语言库中基本都会有排序算法的实现,比如c标准库的qsort,stl的sort函数等.本文首先介绍直接插入排序,归并排序,堆排序,快速排序和基数排序等比较排序算法,然后介绍计数排序,基数排序等具有线性时间的排序算法.本文主要讨论算法的实现方法,并不会过多介绍基本理论. 评价一个排序算法优劣适用与否,一般需要从三个方面来分析 时间复杂度.用比较操作和移动操作数的最高次项表示,由于在实际应用中最在乎的是运行时间的上限,所以一般取输入最坏情况的下的运行时间作为

8大排序算法

常见经典排序算法 1.希尔排序 2.二分插入法 3.直接插入法 4.带哨兵的直接排序法 5.冒泡排序 6.选择排序 7.快速排序 8.堆排序 一.希尔(Shell)排序法(又称宿小增量排序,是1959年由D.L.Shell提出来的) /* Shell 排序法 */ #include <stdio.h> void sort(int v[],int n) {      int gap,i,j,temp;      for(gap=n/2;gap>0;gap /= 2) /* 设置排序的步长,

第三部分数据结构[专业课考试3]

考试题型:问答.分析.编程(廖老师:可用自己熟悉的程序语言.伪代码均可) 总分:60分 一.栈(Stack).队列(Queue)和向量(Vector) 内容: 单链表,双向链表,环形链表,带哨兵节点的链表; 栈的基本概念和性质,栈ADT及其顺序,链接实现;栈的应用;栈与递归; 队列的基本概念和性质,队列ADT及其顺序,链接实现;队列的应用; 向量基本概念和性质;向量ADT及其数组.链接实现; 二.树 内容: 树的基本概念和术语;树的前序,中序,后序,层次序遍历; 二叉树及其性质;普通树与二叉树的

常见的排序方法

常见经典排序算法 1.希尔排序 2.二分插入法 3.直接插入法 4.带哨兵的直接排序法 5.冒泡排序 6.选择排序 7.快速排序 8.堆排序 一.希尔(Shell)排序法(又称宿小增量排序,是1959年由D.L.Shell提出来的) /* Shell 排序法 */ #include <stdio.h> void sort(int v[],int n) { int gap,i,j,temp; for(gap=n/2;gap>0;gap /= 2) /* 设置排序的步长,步长gap每次减半,

JDK排序 DualPivotQuicksort

DualPivotQuicksort是Arrays类中提供的给基本类型的数据排序的算法.它针对每种基本数据类型都有对应的实现,实现方式有细微差异,但思路都是相同的,所以这里只挑选int类型的排序. 整个实现中的思路是:首先检查数组的长度,比一个阈值小的时候直接使用双轴快排.其它情况下,先检查数组中数据的顺序连续性.把数组中连续升序或者连续降序的信息记录下来,顺便把连续降序的部分倒置.这样数据就被切割成一段段连续升序的数列. 如果顺序连续性好,直接使用TimSort算法.TimSort算法的核心在