码迷,mamicode.com
首页 > 编程语言 > 详细

二分法插入排序算法的尝试

时间:2017-09-21 14:52:43      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:退出   插入   一个   部分   问题:   int   查找   --   style   

  这是一个《算法导论》上的练习,可将插入排序的总体运行时间降至Θ(nlgn),我们先看看插入排序的算法代码:

#include <stdio.h>

int main(void)
{
    int arr[] = {6,3,1,5,4,2};
    int i, j;
    int temp;

    for(i = 1; i < sizeof(arr)/sizeof(int); i++)    //运行时间Θ(n)
    {
        temp = arr[i];
        j = i - 1;
        while(j >= 0 && arr[j] > temp)        //这里线性时间进行查找移动,运行时间Θ(n),所以整体运行时间Θ(n^2)
        {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = temp;
    }

    for(i = 0; i < sizeof(arr)/sizeof(int); i++)
        printf("%d ", arr[i]);
    printf("\n");
    return 0;
}

  从代码可以看出,arr[j] > temp的判断查找是在前面所有小于 j 的部分中进行移动和查找的,而小于的 j 部分都是已经排好序的,因此我们可设计使用二分查找带进行更快速的处理。但我的尝试出现了问题:

/**
 *  二分法+插入排序 - Θ(nlgn)
 *
 */
#include <stdio.h>

int main(void)
{
    int arr[] = {6,3,1,5,4,2};
    int i, j;
    int mid, left;
    int temp;

    left = 0;
    for(i = 1; i < sizeof(arr)/sizeof(int); i++)
    {
        temp = arr[i];
        j = i - 1;
        mid = (left + j) / 2;
        while(temp > arr[mid + 1] || temp < arr[mid - 1])        
     //情况是这样的,比如:进行到 123645,当把4进行比较后,从1236中查找位置时
     //只有当同时不满足循环条件,即 3 < 4 < 6 时,不满足条件 ,就可以退出了,当前的 mid 就是4可以插入的位置。
{ if(arr[mid] > temp) mid = (mid + j) / 2; else if(arr[mid] < temp) mid = (left + mid) / 2; } for(j = i - 1; j >= mid; j--){    //移动要插入的位置以后且小于当前比较数以前的位置 arr[j + 1] = arr[j]; } arr[j] = temp;    //把比较数插入其中 } for(i = 0; i < sizeof(arr)/sizeof(int); i++) printf("%d ", arr[i]); printf("\n"); return 0; }

  然而,我的尝试失败了,代码看上去好像没什么问题,但while还是陷入了死循环,不知道什么原因...这个循环条件的判断难道有什么问题吗?我暂时先记录下来吧,改天再继续思考这个问题...

二分法插入排序算法的尝试

标签:退出   插入   一个   部分   问题:   int   查找   --   style   

原文地址:http://www.cnblogs.com/darkchii/p/7568252.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!