十大排序算法函数声明
时间复杂度表
主函数
#include <iostream>
using namespace std;
void BubbleSort ( int length, int array[ ] ) ;
void SelectSort ( int length, int array[ ] ) ;
void InsertSort ( int length, int array[ ] ) ;
void ShellSort ( int length, int array[ ] ) ;
void MergeSort ( int length, int array[ ] ) ;
void QuickSort ( int begin, int end, int array[ ] ) ;
void Swap ( int i, int j, int array[ ] ) ;
int Partition ( int begin, int end, int array[ ] ) ;
void CountSort ( int length, int array[ ] ) ;
void BucketSort ( int length, int array[ ] ) ;
void RadixSort ( int length, int array[ ] ) ;
int main ( ) {
int array[ 6 ] = { 2 , 9 , 1 , 5 , 3 , 6 } ;
cout << "排序前" ;
for ( int i = 0 ; i < 6 ; i++ )
{
cout << array[ i] << "," ;
}
cout << endl;
QuickSort ( 0 , 5 , array) ;
cout << "排序后" ;
for ( int i = 0 ; i < 6 ; i++ )
{
cout << array[ i] << "," ;
}
system ( "pause" ) ;
return 0 ;
}
1冒泡排序(加入flag标记简单优化)
void BubbleSort ( int length, int array[ ] )
{
for ( int i = 0 ; i < length; i++ )
{
bool flag = true ;
for ( int j = 0 ; j < length- i- 1 ; j++ )
{
if ( array[ j] > array[ j + 1 ] )
{
int temp = array[ j] ;
array[ j] = array[ j + 1 ] ;
array[ j + 1 ] = temp;
flag = false ;
}
}
if ( flag)
return ;
}
}
2插入排序
void InsertSort ( int length, int array[ ] )
{
int current;
for ( int i = 0 ; i < length- 1 ; i++ )
{
current = array[ i + 1 ] ;
int preindex = i;
while ( preindex>= 0 && array[ preindex] > current)
{
array[ preindex + 1 ] = array[ preindex] ;
preindex-- ;
}
array[ preindex+ 1 ] = current;
}
}
3希尔排序(优化插排)
void ShellSort ( int length, int array[ ] )
{
int temp, gap = length / 2 ;
while ( gap> 0 )
{
for ( int i = gap; i < length; i++ )
{
temp = array[ i] ;
int preIndex = i - gap;
while ( preIndex>= 0 && array[ preIndex] > temp)
{
array[ preIndex + gap] = array[ preIndex] ;
preIndex - = gap;
}
array[ preIndex + gap] = temp;
}
gap / = 2 ;
}
}
4选择排序(选择最小元素下标)
void SelectSort ( int length, int array[ ] ) {
for ( int i = 0 ; i < length- 1 ; i++ ) {
int minindex = i;
for ( int j = minindex; j < length - 1 ; j++ ) {
if ( array[ minindex] > array[ j + 1 ] ) {
minindex = j + 1 ;
}
}
int temp = array[ i] ;
array[ i] = array[ minindex] ;
array[ minindex] = temp;
}
}
5归并排序(优化选择排序)
void Mergesort ( int L, int R, int array[ ] )
{
if ( L < R)
{
int mid = L + ( ( R - L) >> 1 ) ;
Mergesort ( L, mid, array) ;
Mergesort ( mid + 1 , R, array) ;
Merge ( L, mid, R, array) ;
}
}
void Merge ( int L, int mid, int R, int array[ ] )
{
int * temp= new int [ R - L + 1 ] ;
int i = 0 ;
int p1 = L;
int p2 = mid + 1 ;
while ( p1 <= mid && p2 <= R) {
temp[ i++ ] = array[ p1] < array[ p2] ? array[ p1++ ] : array[ p2++ ] ;
}
while ( p1 <= mid) {
temp[ i++ ] = array[ p1++ ] ;
}
while ( p2 <= R) {
temp[ i++ ] = array[ p2++ ] ;
}
for ( i = 0 ; i < R - L + 1 ; i++ ) {
array[ L + i] = temp[ i] ;
}
delete [ ] temp;
}
6.1快速排序(单向扫描)
void Swap ( int i, int j, int array[ ] )
{
int temp;
temp = array[ i] ;
array[ i] = array[ j] ;
array[ j] = temp;
}
void QuickSort ( int begin, int end, int array[ ] )
{
if ( begin< end)
{
int mid = Partition ( begin, end, array) ;
QuickSort ( begin, mid- 1 , array) ;
QuickSort ( mid + 1 , end, array) ;
}
}
int Partition ( int begin, int end, int array[ ] )
{
int pivot = array[ begin] ;
int sp = begin + 1 ;
int bigger = end;
while ( sp<= bigger)
{
if ( array[ sp] > pivot)
{
Swap ( sp, bigger, array) ;
bigger-- ;
}
else
{
sp++ ;
}
}
Swap ( begin, bigger, array) ;
return bigger;
}
6.2快速排序(双向扫描法)
int DoubblePartition ( int begin, int end, int array[ ] )
{
int pivot = array[ begin] ;
int left = begin + 1 ;
int right = end;
while ( left<= right)
{
if ( array[ left] <= pivot && left <= right)
{
left++ ;
}
if ( array[ right] > pivot&& left <= right)
{
right-- ;
}
else if ( left< right)
{
Swap ( left, right, array) ;
}
}
Swap ( begin, right, array) ;
return right;
}
void DoubbleQuickSort ( int begin, int end, int array[ ] )
{
if ( begin < end)
{
int mid = DoubblePartition ( begin, end, array) ;
DoubbleQuickSort ( begin, mid - 1 , array) ;
DoubbleQuickSort ( mid + 1 , end, array) ;
}
}
7堆排序
8计数排序
9桶排序
10基数排序