各种排序

代码
// 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;
}

 

posted @ 2010-10-20 10:42  新绿  阅读(154)  评论(0编辑  收藏  举报