您的位置:首页 > 其它

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

2012-01-05 10:38 197 查看
插入排序包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序)。
算法思想:假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: