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

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.3.1 直接选择排序
直接选择排序是最简单的选择排序方法,它的基本步骤是(以升序排列为例):首先,在一组数据对象 V[i], …, V[n �C 1] 中选择具有最小关键码的对象,若它不是对象序列 V[i], …, V[n-1] 中的第一个对象,则将它与这组对象中的第一个对象对调,然后这组对象中剔除具有最小关键码的对象。在剩下的对象 V[i+1], …, V[n-1] 中重复执行上述步骤,直到剩余对象只有一个为止。显然在这个过程中,具有相同关键码的对象可能会颠倒次序。直接选择排序算法是一种不稳定的排序方法。
11-6 演示了算法的工作过程。
 
图11-6 直接排序算法
下面给出实现直接选择排序算法的示例代码:
 
//直接选择排序
#ifndef SELECTSORT_H
#define SELCETSORT_H
 
#include <vector>
using namespace std;
 
class SelectSort
{
private:
       int len;
       vector<int> list;
public:
       SelectSort(vector<int> _list, int _len);
       void select_sort();
       void swap(int,int);
       void out();
};
 
#endif
 
#include "SelectSort.h"
#include <iostream>
using namespace std;
 
SelectSort::SelectSort(vector<int> _list, int _len)              // 构造一个数据集合
{
       for (int i=0; i<_len; i++) list.push_back(_list[i]);
       this->len = _len;
}
 
//4 直接选择排序 -------------------------------------------------------
void SelectSort::select_sort()
{
       int k;
       for (int i=0; i<len; i++)                                     // 进行len次比较
       {
              k = i;
              for (int j=i+1; j<len; j++)                           // 找最小元素
                     if (list[j] < list[k]) k = j;
              swap(i, k);                                            // 将最小元素放入i位置
       }
}
 
void SelectSort::swap(int i, int j)                              // 交换两元素位置
{
       int temp = list[i];
       list[i] = list[j];
       list[j] = temp;
}
 
void SelectSort::out()                                              // 输出排序结果
{
       for (int i=0; i<len; i++)
       {
              cout<< list[i] << " ";
              if ((i+1)%18 == 0) cout<<endl;
       }
       cout <<endl;
}
 
由于直接选择排序要比较、交换和移动元素,这些操作往往要耗费比控制循环或操作数组更多的成本,所以在计算复杂度时忽略不计。函数select_sort中的外层for循环执行了n �C 1次,调用swap的次数是n �C 1,元素与临时变量之间的相互操作是2 (n �C 1)次。而在第i次选择的时候,里层的for循环会执行n �C i �C 1次,即进行n �C i �C 1次比较。因此总的关键码比较次数是
1 + 2 + … + (n �C 1) = n (n �C 1) / 2
       总的对象移动次数是3 (n �C 1)次。所以可知n个项目的选择排序需要的主要操作次数为n2 / 2 + 5 × n / 2 �C 3,选择排序的算法复杂度是O(n2)。
       选择排序不依赖于数据的初始排列,这是一个优势。但是由于O(n2)的增率很大,它只适用于较小的n值。该算法需要O(n2)次比较,但需要O(n)次数据移动。在数据移动成本高,比较操作成本低时,选择排序优于其它算法。如果每个数据项比较长,而排序关键字比较短,就可以考虑使用选择排序方法。
----------------------------------------------------

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