二分折半排序

Posted sweetlittlebaby

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分折半排序相关的知识,希望对你有一定的参考价值。

板子:

插入后,每次与中间值相比较,再与左半部分中间值比较,再与右半部份中间值比较,直到找到它自己的位置,

待排序数据:2,1,6,7,4 数据部分:原文https://www.jianshu.com/p/93926f680184

取第一个元素作为有序表,剩余的元素作为无序表

   其中有序表:2;无序表:1,6,7,4

第一次比较,从无序表中取出第一个数 1,与中间值2比较,1<2,1插到2的前面,得到

   有序表:1,2;无序表:6,7,4

第二次比较,从无序表中取出第一个数 6,与中间值1比较,6>1,要放在1的后面,再与后半区(有序表:2)的中间值2比较,6>2,6插入到2的后面,得到

   有序表:1,2,6;无序表:7,4

第三次比较,从无序表中取出第一个数 7,与中间值2比较,7>2,7放在2后面,再与后半区(有序表:6)的中间值6比较,7>6,7放在6后面,得到

   有序表:1,2,6,7;无序表:4

第四次比较,从无序表中取出第一个数 4,与中间值2比较,4>2,4放在2后面,再与后半区(有序表:6,7)的中间值6比较,4<6,4放在6前面,最终得到:

   1,2,4,6,7

数组版本;

技术图片
 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 #include <stdio.h>
 7 #include <stdlib.h>
 8 
 9 void BinInsertSort(int A[], int n)
10 {
11     int i, j, low, mid, high, temp;
12     for(i = 1; i <= n-1; i++)
13     {
14         temp = A[i];                    // 辅助变量temp用来保存待排序的元素
15         low = 0;
16         high = i-1;                     // 有序区间为[0,i-1]
17         while(low <= high)              // 在有序区间内采用折半查找,找到插入位置
18         {
19             mid = (low + high)/2;
20             if(A[mid] > temp)
21                 high = mid - 1;
22             else
23                 low = mid + 1;
24         }
25         for(j = i-1; j >= high+1; j--)  // 移动元素,腾出空间
26             A[j+1] = A[j];
27         A[high+1] = temp;               // 将待排序的元素插入
28     }
29 }
30 
31 int main()
32 {
33     int n;
34     while(cin>>n){
35         int nums[10010];
36         for(int i =0;i<n;++i){
37             cin>>nums[i];
38         }
39         BinInsertSort(nums,n);
40         for(int i =0;i<n;++i){
41             cout<<nums[i]<<" ";
42         }
43     }
44     return 0;
45 }
View Code

 vector版本;

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void BinInsertSort(vector<int>& nums, int n)
{
    vector<int> v;
    for(int i=nums.size()-1;i>=0; i--)//for(int i=0; i<num.size()-1; i++)
    {
        int l=0,r=v.size();
        while(l<r)
        {
            int mid=(l+r)/2;
            if(nums[i]>v[mid]) l=mid+1;
            else r=mid;
        }
        v.insert(v.begin()+r,nums[i]);
    }
    for(vector<int> ::iterator it=v.begin();it!=v.end();it++)
     cout<<*it<<" ";
}

int main()
{
    int n;
    while(cin>>n){
        vector<int > nums(n);
        for(int i =0;i<n;++i){
            cin>>nums[i];
        }
        BinInsertSort(nums,n);
    }
    return 0;
}

 

以上是关于二分折半排序的主要内容,如果未能解决你的问题,请参考以下文章

01. Java的经典排序--选择排序--冒泡排序--折半查找(二分查找)

二分查找和折半插入排序一块说说-很合适~~~

Java实现折半(二分)插入排序

二分折半排序

数组常用算法之冒泡排序二分查找(折半查找)

排序之折半插入排序