二分法插入排序

二分法插入排序 

算法思想简单描写叙述:
在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们
中间的那个元素比,假设小,则对前半再进行折半,否则对后半
进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间
的全部元素后移,再把第i个元素放在目标位置上。

二分法没有排序,仅仅有查找。所以当找到要插入的位置时。移动必须从最后一个记录開始,向后移动一位,再移动倒数第2位,直到要插入的位置的记录移后一位。

二分插入排序是稳定的,平均时间O(n2)

    
void binsort(ref int[] data1)

1、二分法查找插入位置
  假设R[i]<R[m]成立,那右指针就要向左移动中间指针一位,否则,左指针要向左移动中间指针一位。重复查找,直到左指针大于右指针时停止。
2、后移,有点迷惑,什么时候须要后移呢?有哪些记录须要移动呢?
  尽管我们非常清楚的知道,我们须要后移那些排序码大于R[i]的记录,但难免会问自己这样几个问题。事实上它相当于须要移动从i-1到左指针的记录。
3、插入
  由1中得到的左指针事实上就是元素要插入的位置。

4、算法

{

int left,right,num;

int middle,j;

for( int i = 1;i
< data1.Length;i++)

{

// 准备

left
= 0;

right
= i-1;

num
= data1[i];

// 二分法查找插入位置

while( right >= left)

{

// 指向已排序好的中间位置

middle
= ( left + right ) / 2;

if( num < data1[middle] )

// 插入的元素在右区间

right
= middle-1; 

else

// 插入的元素在左区间

left
= middle+1;

}

// 后移排序码大于R[i]的记录

for( j = i-1;j >= left;j-- )

{

data1[j+1]
= data1[j];

}

// 插入

data1[left]
= num;

}

// 插入的元素在左区间

left
= middle+1;

}

// 后移排序码大于R[i]的记录

for( j = i-1;j >= left;j-- )

{

data1[j+1]
= data1[j];

}

// 插入

data1[left]
= num;

}



/* 二分法插入排序的算法源程序*/

#include<stdio.h>

#define MAXNUM 100
typedef int KeyType;
typedef int DataType;

typedef struct {
     KeyType key;        /* 排序码字段 */
     /*DataType info;    记录的其他字段 */
} RecordNode;

typedef struct {
     int n;                /* n为文件里的记录个数,n<MAXNUM */
     RecordNode record[MAXNUM];
} SortObject;

void binSort(SortObject * pvector) {       /* 按递增序进行二分法插入排序 */
     int i, j, left, mid, right;
     RecordNode temp;
     RecordNode *data = pvector->record;
    
     for( i = 1; i < pvector->n; i++ ) {
         temp = data[i];
         left = 0;   right = i-1;            /* 置已排序区间的下、上界初值 */
         while (left <= right) {
             mid = (left + right)/2;        /* mid指向已排序区间的中间位置 */
             if (temp.key < data[mid].key)
                 right = mid-1;             /* 插入元素应在左子区间 */
             else left = mid+1;             /* 插入元素应在右子区间 */
         }
         for (j = i-1;   j >= left;   j--)
             data[j+1] = data[j];           /* 将排序码大于ki的记录后移 */
         if (left != i) data[left] = temp;
     }
}

SortObject vector={10, 49,38,65,97,76,13,27,49,50,101};

int main(){
     int i;
     binSort(&vector);
     for(i = 0; i < vector.n; i++)
         printf("%d ", vector.record[i]);
     getchar();
     return 0;
}

二分法插入排序,布布扣,bubuko.com

时间: 2024-10-05 23:59:14

二分法插入排序的相关文章

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

这是一个<算法导论>上的练习,可将插入排序的总体运行时间降至Θ(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 &am

排序—二分法插入排序

思路和插入排序一样,可见:http://www.cnblogs.com/PerkinsZhu/p/5664808.html 不同点: 在寻找插入位置的时候采用二分法定位.二分法怎么定位?…… 运行结果: 原数组:              21.8.2.18.0.9.27.12.5.24. 第0次循环排序结果: 8.21.2.18.0.9.27.12.5.24.第1次循环排序结果: 2.8.21.18.0.9.27.12.5.24.第2次循环排序结果: 2.8.18.21.0.9.27.12.5

矿Java开发学习之旅------&amp;gt;Java排序算法经典的二分法插入排序

一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为採用折半比較,就可以得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比較,就是在插入A[i]时,取A[i-1/2]的关键码值与A[i]的关键码值进行比較,假设A[i]的关键码值小于A[i-1/2]的关键码值.则说明A[i]仅仅能插入A[0]到A[i-1/2]之间.故能够在A[0]到A[i-1/2-1]之间继续使用折半比較:否则仅仅能插入A[i-1/2]到A[i-1]之间

二分法插入排序--C

// // main.c // binarySort // // Created by 韩雪滢 on 10/15/16. // Copyright © 2016 韩雪滢. All rights reserved. // //复杂度O(nlogn) #include <stdio.h> int a[10]={21,56,43,12,3,99,56,23,2,12}; int main() { int i,j,k,low,high,mid,t; for(i=k=1;i<sizeof a/si

【模板小程序】二分法插入排序

Java版源程序来自:http://www.cnblogs.com/PerkinsZhu/p/5674572.html,在此感谢. 1 #include <iostream> 2 #include <vector> 3 #include <string> 4 using namespace std; 5 6 void printArray(string str,vector<int>& array){ 7 cout<<str; 8 for

插入排序(JAVA)

package org.rev.algorithm; /**  * 插入排序:每次将一个待排序的记录,按其大小插入到前面已经排序的子序列的合适位置,直到全部插入.  *   * 1. 直接插入排序:和已经排序的部分逐一比较找到合适位置  *   * 2. 二分插入排序:使用二分法找到合适的位置  *   * 3. 希尔排序(Shell Sort):分组的直接插入排序  *   */ public class InsertionSort {   public static void main(St

iOS 排序算法总结、二分法查找

还有一个:二分插入排序  平均时间O(n2)   稳定 1.插入排序 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. 直接插入排序是稳定的.算法时间复杂度O(n2)--[n的平方] main() { int  a[10],j,i,m; for(j=1;j<10;j++) { m=a[j]; for(i=j-1;i>=0;i--) { if(a[i]<m) b

各种排序算法的分析及java实现

各种排序算法的分析及java实现 排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间重新研究了一下. 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几类: (1).插入排序:直接插入排序.二分法插入排序.希尔排序. (2).

js十大排序算法详解

十大经典算法导图  图片名词解释:n: 数据规模k:"桶"的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存 1.冒泡排序 1.1  原始人冒泡排序 function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j+1]