1. 程式人生 > >演算法設計之計數排序 (C++實現)

演算法設計之計數排序 (C++實現)

之前的文章介紹的一些排序演算法有一個共同特點,它們都是基於比較的。這些演算法都有的一個性質就是:在排序的最終結果中,各元素的次序依賴於它們之間的比較。對包含n個元素的輸入序列來說,任何比較排序在最好情況下都要經過nlgn次比較。因此,歸併排序和堆排序是漸進最優的,任何已知的比較排序最多就是在常數因子上優於它們。本篇文章介紹一種線性時間複雜度的排序演算法--計數排序:

計數排序假設n個輸入元素中的每一個都是在 0到k閉區間內的一個整數,其中k為某個整數。計數排序的基本思想是:對每一個輸入元素x,確定小於x的元素個數。利用這一資訊就可以 直接把x放到它在輸出陣列中的位置上。

我發現向量比陣列用起來更舒服。不過要注意,用來訪問向量的索引值是無符號整形,定義變數時要使用 size_t

或者把無符號整形強轉為有符號整形。

// countingSort2.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include "iostream"
#include "vector"
using namespace std;
void countingSort(vector<int>& ,vector<int>&,int);
int _tmain(int argc, _TCHAR* argv[])
{
	int a[21]={2,3,4,5,1,3,4,2,4,4,2,5,2,2,4,2,1,4,3,5,2};
	int k=5;//待排序的元素均小於此值
	vector<int> A(a,a+21);//輸入陣列
	vector<int> B(A.size());//存放排序的輸出
	countingSort(A,B,k);
	for(size_t i=0;i<B.size();i++)
		cout<<B[i]<<",";
	cout<<endl;

	return 0;
}

void countingSort(vector<int>& A,vector<int>& B,int k)
{
	vector<int> C(k+1);
	for(size_t i=0;i<A.size();i++)
		C[A[i]]=C[A[i]]+1;
	for(int i=1;i<=k;i++)
		C[i]=C[i]+C[i-1];
	for(int j=(int)A.size()-1;j>=0;j--)
	{
		B[C[A[j]]-1]=A[j];
		C[A[j]]=C[A[j]]-1;
	}
}