算法——直接插入和希尔排序

插入排序包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序)。

算法思想:假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[1…k]是局部有序的,保证了插入过程的正确性.

1.直接插入

每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。

第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。

直接插入排序属于稳定的排序,时间复杂性为o(n^2),空间复杂度为O(1)。

C/C++代码实现直接插入排序:

  

// 直接插入.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;



void InsertSort(int *arr,int n) 
{ 
	int i,j; 
	int temp; 
	for(i=1;i<n;i++) 
	{ 
		temp = arr[i];//将要比较的数存在temp中 
		for(j=i ; j>0 && temp < arr[j-1] ; j--)//将已排列的数组和要排列的数进行比较 
		{ 
			arr[j]=arr[j-1];// 所有大的数向右移动一位 
		} 
		arr[j]=temp; 
	} 
}

int _tmain(int argc, _TCHAR* argv[])
{
	int arr[]={2,6,7,5,8,1,9,10,3,4};
	int n=10;
	InsertSort(arr,10);
	for(int k=0;k<n;k++)
		cout<<arr[k]<<" ";
	 int X;  
    cin>>X; 
	return 0;

}

2.希尔排序:

基本思想是:取一个间隔(gap),将序列分成若干的子序列,对每个子序列进行直插排序;然后逐渐缩小间隔,重复以上过程,直到间隔为1。不需要大量的辅助空间,和归并排序一样容易实现。希尔排序是基于插入排序的一种算法,在此算法基础之上增加了一个新的特性,提高了效率。希尔排序的时间复杂度为 O(N*(logN)2),

C/C++代码实现:

// 希尔排序.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;



void shell_Sort(int *arr,int n) 
{ 
	int h, j, k, t;
	for (h=n/2; h>0; h=h/2) /*控制增量*/
	{
		for (j=h; j<n; j++) /*这个实际上就是上面的直接插入排序*/
		{
			t = arr[j];
			for (k=j-h; k>=0 && t<arr[k]; k-=h)
			{
				arr[k+h] = arr[k];
			}
			arr[k+h] = t;
		}
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	int arr[]={2,6,7,5,8,1,9,10,3,4};
	int n=10;
	shell_Sort(arr,10);
	for(int k=0;k<n;k++)
		cout<<arr[k]<<" ";
	 int X;  
    cin>>X; 
	return 0;

}


 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值