插入排序

来源:互联网 发布: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;
 }

  

0 0
原创粉丝点击