各种排序

代码
//  sort_test.cpp : 定义控制台应用程序的入口点。
//

#include 
" stdafx.h "
#define  M 5
#define  N 10
#include 
< cstdio >
#include 
< iostream >

using   namespace  std;

// 直接插入排序
// 直接插入排序的时间复杂度为:O(n^2)
// 若待排记录为“正序”时,时间复杂度可提高至:O(n)
void  InsertSort_fun( int  a[M])
{
    
int  i,j,key;
    
for (i = 1 ;i < M;i ++ )
        
if (a[i] < a[i - 1 ])
        {
            key
= a[i];
            a[i]
= a[i - 1 ];
            
// j=i-2;
            
// cout << "j:"<< j <<"  a[j-2]"<< a[j] << endl;
             for (j = i - 2 ;j >= 0 && key < a[j]; -- j) // 因为没有设哨兵,所以增加了一个条件j>=0
            {
                
// cout << j << endl;
                a[j + 1 ] = a[j];
            }
            a[j
+ 1 ] = key;
        }
}

void  InsertSort_test()
{
    printf(
" InsertSort test:\n " );

    
int  i,a[ 5 ] = { 5 , 4 , 3 , 2 , 1 };
    
for (i = 0 ;i < 5 ;i ++ )
        printf(
" %d, " ,a[i]);
    cout 
<<  endl;
    InsertSort_fun(a);
    printf(
" after sort:\n " );
    
for (i = 0 ;i < 5 ;i ++ )
        printf(
" %d, " ,a[i]);
}


// 折半插入排序
// 折半插入相对直接插入减少了关键字的比较次数:O(nlogn)
// 但移动次数不变,时间复杂度仍为:O(n^2)
void  BInsertSort_fun( int  a[M])
{
    
int  i,key,low,high,mid,j;
    
for  (i = 1 ;i < M;i ++ )
    {
        
            key
= a[i];
            a[i]
= a[i - 1 ];
            low
= 0 ;high = i - 1 ;
            
while (low <= high)
            {
                mid
= (low + high) / 2 ;
                
if (key < a[mid])
                    high
= mid - 1 ;
                
else
                    low
= mid + 1 ;
            }
            
for (j = i - 1 ;j > high - 1 ;j -- )
                a[j
+ 1 ] = a[j];
            a[high
+ 1 ] = key;
    }
}
        
void  BInsertSort_test()
{
    printf(
" Bin InsertSort test:\n " );

    
int  i,a[ 5 ] = { 1 , 3 , 2 , 5 , 4 };
    
for (i = 0 ;i < 5 ;i ++ )
        printf(
" %d, " ,a[i]);
    cout 
<<  endl;
    BInsertSort_fun(a);
    printf(
" after sort:\n " );
    
for (i = 0 ;i < 5 ;i ++ )
        printf(
" %d, " ,a[i]);
}


void  ShellInsert( int  a[N], int  dk)
{
    
int  i,key,j;
    
for (i = dk;i < N;i ++ )
    {
        
if (a[i] < a[i - dk])
        {
            key
= a[i];
            
// a[i]=a[i-dk];
             for (j = i - dk;(j >= 0 ) && (key < a[j]);j -= dk)
                a[j
+ dk] = a[j];
        
            a[j
+ dk] = key;
        }
    }
}


// 希尔排序
// 注意使增量序列dlta[]中的值没有除1之外的公因子,并且最后一个增量值必须等于1
void  ShellSort_fun( int  a[N], int  dlta[], int  t)
{
    
int  k;
    
for (k = 0 ;k < t; ++ k)
        ShellInsert(a,dlta[k]);
}

void  ShellSort_test()
{
    
int  dlta[ 3 ] = { 3 , 2 , 1 };
    cout 
<<   "  Shell sort test : "   <<  endl;
    
int  i;
    
int  a[N] = { 2 , 1 , 5 , 3 , 6 , 8 , 7 , 10 , 9 , 4 };
    cout 
<<   " befor sort: "   <<  endl;
    
for  (i = 0 ;i < N;i ++ )
        cout 
<<  a[i]  <<   " , "  ;
    cout 
<<  endl;
    
    
    ShellSort_fun(a,dlta,
3 );
    cout 
<<   " after sort  "   <<  endl;
    
for (i = 0 ;i < N;i ++ )
        cout 
<<  a[i]  <<   " , "  ;
    cout 
<< endl;
}


// 冒泡排序
// 时间复杂度:O(n^2)
// 空间复杂度:1
// 稳定性:稳定
void  bubble_sort_fun( int  a[], int  n)
{
    
int  i,j,tmp,change = 1 ;
    
for (i = n - 1 ;i >= 1 && change;i -- )
        
for (j = 0 ;j < i;j ++ )
        {
            change
= 0 ;
            
if (a[j] > a[j + 1 ])
            {
                change
= 1 ;
                tmp
= a[j];
                a[j]
= a[j + 1 ];
                a[j
+ 1 ] = tmp;
            }
        }
}


void  bubble_sort_test()
{
    printf(
" Bubble  Sort test:\n " );

    
int  i,a[ 5 ] = { 1 , 3 , 2 , 5 , 4 };
    
for (i = 0 ;i < 5 ;i ++ )
        printf(
" %d, " ,a[i]);
    cout 
<<  endl;
    bubble_sort_fun(a,M);
    printf(
" after sort:\n " );
    
for (i = 0 ;i < 5 ;i ++ )
        printf(
" %d, " ,a[i]);
}

void  exchange( int   &  a, int   & b)
{
    
int  tmp;
    tmp
= a;
    a
= b;
    b
= tmp;
}



// 快速排序
// 在所有同数量级O(nlogn)的排序方法中,其平均性能最好
// 但若初始记录关键字有序或基本有序时,快速排序将蜕化为冒泡排序,其时间复杂度为O(n^2)
// 快速排序需要一个栈空间来实现递归,栈的最大深度为[log2n]+1,最坏情况深度为n
// 前提:必须是顺序存储
// 稳定性:不稳定

int  partition( int  a[M], int  low, int  high)
{
    
// 交换顺序表a中子表a[low...high]的记录,使枢轴记录到位,并返回其所在位置
    
// 此时在它之前(后)的记录均不大(小)于它
     int  pivotkey;
    pivotkey
= a[low];
    
while (low < high)
    {
        
while (low < high && a[high] >= pivotkey)
            
-- high;
        exchange(a[low],a[high]);
        
while (low < high && a[low] <= pivotkey)
            
++ low;
        exchange(a[low],a[high]);
    }
    
return  low;
}

void  QSort( int  a[], int  low, int  high)
{
    
int  pivotloc;
    
if (low < high)
    {
        pivotloc
= partition(a,low,high);
        QSort(a,low,pivotloc
- 1 );
        QSort(a,pivotloc
+ 1 ,high);
    }
}

void  quick_sort_test()
{
    printf(
" Quick  Sort test:\n " );

    
int  i,a[M] = { 1 , 3 , 2 , 5 , 4 };
    
for (i = 0 ;i < M;i ++ )
        printf(
" %d, " ,a[i]);
    cout 
<<  endl;
    QSort(a,
0 ,M - 1 );
    printf(
" after sort:\n " );
    
for (i = 0 ;i < 5 ;i ++ )
        printf(
" %d, " ,a[i]);
}
        

int  SelectMinkey( int  a[], int  i, int  n)
{
    
int  j,min = a[i],m = i;
    
for (j = i + 1 ;j < n;j ++ )
    {
        
if (a[j] < min)
        {
            min
= a[j];
            m
= j;
        }
    }

    
return  m;
}

// 简单选择排序
// 无论记录的初始排列如何,所需进行的关键字间的比较次数相同,均为n(n-1)/2
// 空间复杂度:1
void  select_sort_fun( int  a[], int  n)
{
    
int  i,j;
    
for (i = 0 ;i < n; ++ i)
    {
        j
= SelectMinkey(a,i,n);
        
if (i != j)
            exchange(a[i],a[j]);
    }
}

void  select_sort_test()
{
    printf(
" Select  Sort test:\n " );

    
int  i,a[M] = { 1 , 3 , 2 , 5 , 4 };
    
for (i = 0 ;i < M;i ++ )
        printf(
" %d, " ,a[i]);
    cout 
<<  endl;
    select_sort_fun(a,M);
    printf(
" after sort:\n " );
    
for (i = 0 ;i < 5 ;i ++ )
        printf(
" %d, " ,a[i]);
}

int  _tmain( int  argc, _TCHAR *  argv[])
{
    
//
    
// InsertSort_test();

    
//
    
// BInsertSort_test();

    
//
    
// ShellSort_test();

    
//
    
// bubble_sort_test();
    
    
//
    
// quick_sort_test();

    
//
    select_sort_test();
    
    
while ( 1 );
    
return   0 ;
}

 

你可能感兴趣的:(排序)