《C++数据结构原理与经典问题求解》―10种排序算法的实现3

C++数据结构原理与经典问题求解
 
编著者:左飞
出版社:电子工业出版社
ISBN号: 978-7-121-07321-2
丛书名:C/C++开发专家
出版日期: 2008-10
字数:870.4千字
页码:548
开本:16
http://www.phei.com.cn/bookshop/bookinfo.asp?bookcode=TP073210&booktype=main
http://product.dangdang.com/product.aspx?product_id=20385620
 
 
11章 排序
 
11.2.2 二分法插入排序
 
二分插入排序又叫折半插入排序,它同直接插入排序一样,是将每次将一个数据对象插入已经排好序的顺序表中。设在顺序表中有对象序列V[0], V[1], …, V[n-1],其中V[0], V[1], …, V[i-1]是已经排好序的对象。二分插入排序是用折半查找法寻找V[i]的插入位置,然后插入这个对象,同样需要n-1趟比较。折半查找法的使用是二分插入排序与直接插入排序的区别。
 
由于折半查找法的使用,使得这种算法较朴素的直接插入排序在效率上有了很大的增进。图11-2演示了如何使用折半查找法在目标数组中确定数字35的位置。首先确定位于有序目标数组中间位置的数字为45。由于45>35,所以在将原数组折半,并取左半部分作为搜索目标。由于23<35,所以选择子串的右半部分作为搜索目标。而35<36,即可以确定35的位置应该在23与36之间。
 
 
图11-2 折半查找法
在本书第六章中曾经介绍过应用递归实现折半查找的方法,这里不再赘述。下面给出了实现二分插入排序算法的源代码:
// 二分插入排序
#ifndef BINARYINSERTSORT_H
#define BINARYINSERTSORT_H
 
#include <vector>
using namespace std;
 
class BinaryInsertSort
{
private:
       int len;
       vector<int> list;
public:
       BinaryInsertSort(vector<int> _list, int _len);
       void binary_insert_sort();
       void out();
};
 
#endif
 
#include "BinaryInsertSort.h"
#include <iostream>
using namespace std;
 
BinaryInsertSort::BinaryInsertSort(vector<int> _list, int _len)    // 构造一个顺序表
{
       for (int i=0; i<_len; i++) list.push_back(_list[i]);
       this->len = _len;
}
 
//2 二分插入排序
void BinaryInsertSort::binary_insert_sort()
{
       int middle;
       for (int i=0; i<len; i++)
       {
              int insertNum = list[i];
              int left = 0;
              int right = i-1;
             
              while (left <= right)                           // 二分法寻找插入位置
              {
                     middle = (left + right)/2;
                     if (insertNum > list[middle]) left = middle+1;
                     else right = middle-1;
              }
              for (int j=i; j>left; j--) list[j] = list[j-1];
              list[left] = insertNum;
       }
}
 
void BinaryInsertSort::out()                        // 输出结果
{
       for (int i=0; i<len; i++)
       {
              cout<< list[i] << " ";
              if ((i+1)%18 == 0) cout<<endl;
       }
       cout <<endl;
}
 
二分查找比顺序查找快,所以二分插入排序就平均性能来说比直接插入排序要快。它所需要的关键码比较次数与对象个数紧密相关。插入第i个对象时,需要经过(此处公式无法显示)次关键码比较,那么将n (n = 2k)个对象用二分插入排序所进行的关键码比较次数为:
 
 
可以看到,当n较大时,二分查找算法的关键码比较次数比直接插入排序的在完全逆序下的情况要好,比其在完全有序下的情况要差。所以应根据不同情况灵活选用这两种方法。在对象的初始排列已经有序或者接近有序时,应用直接排序算法。至于二分插入排序和直接插入排序在对象移动次数上的区别,请读者自己思考。二分插入排序算法同直接插入排序一样,是稳定的排序方法。
----------------------------------------------------
 

你可能感兴趣的:(排序,职场,二分法,休闲)