c++ - 利用二分查找误差的插入排序算法

标签 c++ algorithm insertion-sort

我运行了以下代码,它是插入排序算法,它使用二进制搜索来找到插入项目的正确位置而不是线性搜索,但结果中有两个数字没有正确排序!

#include <iostream>
using namespace std;

void insertion_sort (int a[], int n /* the size of array */)
{
    int i, temp,j;
    for (i = 1; i < n; i++)
    {
        /* Assume items before a[i] are sorted. */
        /* Pick an number */
        temp = a[i];

        /* Do binary search to find out the
           point where b is to be inserted. */

        int low = 0, high = i - 1, k;

        while (high-low>1)
        {
            int mid = (high + low) / 2;

            if (temp <= a[mid]) 
                high = mid;
            else 
                low = mid;
        }

        /* Shift items between high and i by 1 */
        for (k = i; k > high; k--)
            a[k] = a[k - 1];

        a[high] = temp;
    }
}


int main()
{
    int A[15]={9,5,98,2,5,4,66,12,8,54,0,11,99,55,13};
    insertion_sort(A,15);
    for (int i=0; i<15; i++)
        cout<<A[i]<<endl;
    system("pause");
    return 0;
}

输出:

enter image description here

为什么?

最佳答案

#include <iostream>
using namespace std;

void insertion_sort (int a[], int n /* the size of array */)
{
    int i, temp,j;
    for (i = 1; i < n; i++)
    {
        /* Assume items before a[i] are sorted. */
        /* Pick an number */
        temp = a[i];

        /* Do binary search to find out the
           point where b is to be inserted. */

上限应该在范围之上并且不包括搜索,因为您可能需要在末尾插入,即什么都不做。

        // int low = 0, high = i - 1, k;
        int low = 0, high = i, k;

这里的条件应该是low < high , 不是 low + 1 < high

        // while (high-low>1)
        while (low < high)
        {
            int mid = (high + low) / 2;

            if (temp <= a[mid]) 
                high = mid;
            else 

一旦你有a[mid ] 严格大于 temp , 插入的最低可能位置是 mid + 1 .

                // low = mid;
                low = mid + 1
        }

        /* Shift items between high and i by 1 */
        for (k = i; k > high; k--)
            a[k] = a[k - 1];

        a[high] = temp;
    }
}


int main()
{
    int A[15]={9,5,98,2,5,4,66,12,8,54,0,11,99,55,13};
    insertion_sort(A,15);
    for (int i=0; i<15; i++)
        cout<<A[i]<<endl;
    system("pause");
    return 0;
}

关于c++ - 利用二分查找误差的插入排序算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19890189/

相关文章:

c++ - 如何在 C 中实现 C++ 虚函数

c++ - 动态规划/内存(计算三元组)

c# - 无溢出异常的平均函数

algorithm - 如何有效地存储具有高度冗余值的矩阵

java - 选择排序比较和交换已经排序的列表

c - 如何提高 C 中大数据排序的执行速度

c++ - 一对使用unique_ptr

c++ - 在 api 中检索 Maya 着色器的颜色

Python连接图像上的分割轮廓

algorithm - 为什么当输入大小改变时算法的优先级会改变