插入排序
来源:互联网 发布:windows程序视频 编辑:程序博客网 时间:2024/05/21 20:29
插入排序:
insertSort
1.ieda:
比如从小到大排序,编号为i的元素A[i],认为其前面的元素已经有序(即0~i-1的元素已经是从小到大有序),
然后A[i]与其前面的元素(i-1~0)逐个比较。比A[i]大的元素后移,将A[i]放在合适的位置。
complexity: n^2
2.input:
数组A,size n;
3.output:
排好的数组A
4.process :
insertSort(int * A, int n){
for: i: 1~n-1,i++
{
temp=A[i];//用以保存A[i]的值,后面A[i]的值在后移时被覆盖。
for: j: i-1~0&&A[j]>temp;j--
// 因为是从右往左移,所以必须是j从i-1到0变化。
{
A[j+1]=A[j];
}
A[j+1]=temp;
}
}
具体实现:
void insertSort(int * A ,int n){
int i,j,temp;
for(i=1;i<n;i++)
{
temp=A[i];//用以保存A[i]的值,后面A[i]的值在后移时被覆盖。
for(j=i-1;j>=0&&A[j]>temp;j--)
{
A[j+1]=A[j];
}
A[j+1]=temp;
}
}
5.改进:
二分插入排序:BInsertSort(int []A,int n)
在寻找A[i]的位置时用了折半查找方法。因为A[i]之前的元素已经是有序的,
所以可以用折半查找法。
for: i: 1~n-1;i++{
temp=A[i];
left=0;
right=i-1;
while(left<=right)
{
mid=(left+right)>>1;
if(A[mid]>temp)
right=mid-1;
else
left=mid+1;
}//最终left==right
for:j: i-1~left ,j--
{
A[j+1]=A[j];
}
A[left]=temp;
}
具体实现:
//找到>=value的第一个数的下标。
int BinarySearch3(int *A ,int n,int value){
int left=0;
int right=n-1;
int mid,first=-1;//初始化first,若没有找到,则为-1
while(left<=right){
mid=left+(right-left)/2;
if(A[mid]>=value){
first=mid;
right=mid-1;// 因为A[mid]>value,所以用first不断保存mid,且mid一直在用右往左移动。
}
else
{
left=mid+1;
}
}
return first;
}
void BiInsertSort(int * A,int n){
int i,j,temp;
int first=-1;
for(i=1;i<n;i++){
temp=A[i];
first=BinarySearch3(A,n,temp);
if(first!=-1){
for(j=i-1;j>=first;j--)
A[j+1]=A[j];
A[first]=temp;
}
}
}
范例:
#include <iostream>
using namespace std;
#define N 7
int A[N]={1,6,7,6,9,2,6};
//找到>=temp 的第一个数的位置。
int BinarySearch(int * A, int left ,int right,int temp){
int mid=-1;
int first=-1;
while(left<=right){
mid=left+(right-left)/2;
if(A[mid]>=temp){
first=mid;
right=mid-1;
}
else left=mid+1;
return first;
}
}
int main()
{
int i,j,k,temp=-1;
//int flag=0;
cout<<"paixuqian"<<endl;
for(i=0;i<N;i++)
cout<<A[i]<<" ";
int left,right,temp,loc;
for(i=1;i<N;i++)
{
temp=A[i];
left=0;
right=i-1;
loc=BinarySearch(A,left,right,temp);
for(j=i-1;j>=loc;j--)
{
A[j+1]=A[j];
}
A[loc]=temp;
}
cout<<endl<<"hou "<<endl;
for(i=0;i<N;i++)
cout<<A[i]<<" ";
cout << endl<<"Hello world!" << endl;
return 0;
}
- 插入排序-【插入排序】
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- html5 特性介绍
- FZU 2082 求树上任意点间距离 边权转为点权 树链剖分
- Maven学习笔记之maven的生命周期
- 畅通工程续
- hdu3172
- 插入排序
- Maven学习笔记之maven插件的配置
- zend studio10.6配置xdebug版本是否线程安全
- ZDAPP_CONFIG_PAN_ID
- 关于一个c语言中的小陷阱(数据类型之间的转换)
- 关于ArrayList的5道面试题
- spark+openfire二次开发(二)
- 在Eclipse上建立Openfire工程的过程
- 小米3观感:说说时下手机圈里的那些人和事