泛型,Quick Sort 的C/C++两种实现方式

来源:互联网 发布:路由器上面的访客网络 编辑:程序博客网 时间:2024/05/20 11:25

Quick Sort 作为20世纪的10大算法,实现的算法思想为分治策略(Divide And Conquer)。分治策略这种思想是程序设计中最常用到的思想。它的基本思想是把原问题递归划分为若干个子问题,通过分别求解子问题(相对简单情况),然后组合这些子问题的解,从而形成原问题的解。本文,分别用C/C++实现泛型的Quick Sort,具体代码如下:


#ifndef _MERGE_SORT_H_#define _MERGE_SORT_H_#define  MAXLEN  65535#include <functional>#include <algorithm>#include <iostream>/** swap data object for c++ implementation of quick sort**/template<class T>void SwapObj( T& first, T& second ){T temp = first;first = second;second = temp;}/** c++ implementation of generic quick sort**/template<class T>int PartitionCPlus( T item[], int left, int right ){int i = left - 1;int j = right;T   pivot = item[right];while( i <= j ){while( item[++i] < pivot );while( item[--j] > pivot ){if( j <= i )break;}if(  j <= i )break;SwapObj( item[i], item[j] );}SwapObj( item[i],  item[right] );return i;}/** interface of c++ implementation of generic quick sort**/template<class T>void QuickSortCPlus( T item[], int left, int right ){if( left >= right )return;int mid = PartitionCPlus( item, left, right );QuickSortCPlus( item, left, mid - 1 );QuickSortCPlus( item, mid + 1, right );}/** swap data object for c implementation of quick sort**/void SwapCharBuffer( void* first, void* second, size_t elemSize ){char* buf = (char*)malloc(elemSize);assert( buf );memcpy( buf, (char*)first, elemSize );memcpy( first, second, elemSize );memcpy( second, buf, elemSize );free( buf );}/** c implementation of generic quick sort**/void ImplQuickSortC( void* item, size_t elemSize, int (*cmp)( void* first, void* second ), int start, int end ){if( start >= end )return;void* pivot = (char*)item + start;int i = start + elemSize;int j = end;while( i < j ){if( cmp( (char*)item + i, pivot ) <= 0 ){i += elemSize;}else{j -= elemSize;SwapCharBuffer( (char*)item + i, (char*)item + j, elemSize );}}i -= elemSize;SwapCharBuffer( (char*)item + start, (char*)item + i, elemSize );ImplQuickSortC( item, elemSize, cmp, start, i );ImplQuickSortC( item, elemSize, cmp, j, end );}/** interface function of c implementation of generic quick sort**/void QuickSortC( void* item, size_t elemCount, size_t elemSize, int (*cmp)( void* first, void* second ) ){ImplQuickSortC( item, elemSize, cmp, 0, (elemCount)*elemSize );}int CmpFunc( void* first, void* second ){return *(int*)first - *(int*)second;}template<class T>void Output( const T item[], size_t len ){std::cout << "output result as follows:" << std::endl;int intervalLen = 10;for( int i= 0; i < len; i++ ){if( 0 == i || (i %  10) ){std::cout<< item[i] << " ";}else{std::cout << std::endl;std::cout << item[i] << " ";}}std::cout << std::endl;}void TestQuickSortC(){const int maxLen = 100;int item[maxLen];for( int i = 0; i < maxLen; i++ ){item[i] = i;}std::random_shuffle( item, item + maxLen );QuickSortC( item, maxLen, sizeof(int), CmpFunc);Output( item, maxLen );}void TestQuickSortCPlus(){const int maxLen = 100;int item[maxLen];for( int i = 0; i < maxLen; i++ ){item[i] = i;}std::random_shuffle( item, item + maxLen );QuickSortCPlus( item, 0, maxLen - 1 );Output( item, maxLen );}#endif 


0 0
原创粉丝点击