• 二分折半排序


    板子:

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

    待排序数据: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;
    }
  • 相关阅读:
    javaweb基础(33)_jdbc的crud操作
    javaweb基础(32)_jdbc学习入门
    javaweb基础(31)_国际化(i18n)
    javaweb基础(30)_EL函数库
    javaweb基础(29)_EL表达式
    javaweb基础(28)_jstl的核心标签
    javaweb基础(27)_jsp标签库实例
    javaweb基础(26)_jsp标签库开发二
    javaweb基础(25)_jsp标签实例一
    选择之难
  • 原文地址:https://www.cnblogs.com/sweetlittlebaby/p/12693153.html
Copyright © 2020-2023  润新知