首页 > 技术文章 > 七种排序算法(没有基数排序)

aoun 2013-10-25 09:41 原文

#include <iostream>
#include <ctime>
using std::cout;
using std::cin;
using std::endl;

#define SIZE 100

bool Check(int *);//检验函数
void BubbleSortUp(int *, int n);//冒泡排序-上升
void BubbleSortDown(int *, int n);//冒泡排序下降
void InsertSort(int *, int n);//直接插入排序
int Partition(int *, int n);//快速排序
void QuickSort(int *, int n);
void ShellSort(int *, int n);//希尔排序
void SelectSort(int *, int n);//直接选择排序
void Sift(int *, int, int);//建堆, 堆排序
void HeapSort(int *, int n);
void Merge(int *, int *, int low, int mid, int high);//归并排序
void MergePass(int *, int *, int n, int len);
void MergeSort(int *, int);

int main()
{
    int Array[SIZE];//生成随机数组
    srand((unsigned)time(0));
    for(int i=0; i<SIZE; i++)
    {
        Array[i] = rand()%(SIZE);
    }
    
    cout<<"Please choose sorting algorithm:"<<endl \
        <<"1.冒泡排序(上升)"<<endl \
        <<"2.冒泡排序(下降)"<<endl \
        <<"3.直接插入排序"<<endl \
        <<"4.快速排序"<<endl \
        <<"5.希尔排序"<<endl \
        <<"6.直接选择排序"<<endl \
        <<"7.堆排序"<<endl \
        <<"8.二路归并"<<endl;
    int nChoose;
    cin>>nChoose;//提示,选择

    time_t tmStart;
    time_t tmEnd;
    switch(nChoose)
    {
    case 1: 
        tmStart = time(0);
        BubbleSortUp(Array, SIZE);
        tmEnd = time(0);
        break;
    case 2:
        tmStart = time(0);
        BubbleSortDown(Array, SIZE);
        tmEnd = time(0);
        break;
    case 3:
        tmStart = time(0);
        InsertSort(Array, SIZE);
        tmEnd = time(0);
        break;
    case 4:
        tmStart = time(0);
        QuickSort(Array, SIZE);
        tmEnd = time(0);
        break;
    case 5:
        tmStart = time(0);
        ShellSort(Array, SIZE);
        tmEnd = time(0);
        break;
    case 6:
        tmStart = time(0);
        SelectSort(Array, SIZE);
        tmEnd = time(0);
        break;
    case 7:
        tmStart = time(0);
        HeapSort(Array, SIZE);
        tmEnd = time(0);
        break;
    case 8:
        tmStart = time(0);
        MergeSort(Array, SIZE);
        tmEnd = time(0);
        break;
    default:
        break;
    }

/*    for(int i=0; i<SIZE; i++)
    {
        cout<<Array[i]<<" ";
    }*///输出排序结果

    bool result = Check(Array);//检验排序结果
    if(true == result)
        cout<<"Congratulatoin, Sorting right!!!"<<endl
            <<"Cost "<<tmEnd - tmStart<<" s.";
    else
        cout<<"Sorry, Sorting error!!!"<<endl;

    return 0;
}

bool Check(int *Array)
{
    bool flag = true;
    for(int i=0; i<SIZE-1; i++)
    {
        if(Array[i] > Array[i+1])
        {
            flag = false;
            break;
        }
    }
    return flag;
}

void BubbleSortUp(int *Array, int n)
{
    int i, j;
    bool flag;
    int temp;
    for(i=0; i<n-1; i++)
    {
        flag = false;
        for(j=n-1; j >= i+1; j--)
        {
            if(Array[j] < Array[j-1])
            {
                flag = true;
                temp = Array[j];
                Array[j] = Array[j-1];
                Array[j-1] = temp;
            }
        }
        if(!flag) break;
    }
}

void BubbleSortDown(int *Array, int n)//冒泡排序下降
{
    int i, j;
    bool flag;
    int temp;
    for(i=0; i<n-1; i++)
    {
        flag = false;
        for(j=0; j <= n-2-i; j++)
        {
            if(Array[j] > Array[j+1])
            {
                flag = true;
                temp = Array[j];
                Array[j] = Array[j+1];
                Array[j+1] = temp;
            }
        }
        if(!flag) break;
    }
}

void InsertSort(int *Array, int n)//插入排序
{
    int i, j;
    int temp;
    for(i=1; i <= n-1; i++)
    {
        if(Array[i] >= Array[i-1]) continue;
        temp = Array[i];
        j = i-1;
        do{
            Array[j+1] = Array[j];
            j--;
        }while(Array[j] > temp);
    }
}

int Partition(int *Array, int n)//快速排序
{
    int i, j;
    int temp;
    i=0; 
    j=n-1;
    temp = Array[0];
    while(i < j)
    {
        while((i < j) && (Array[j] >= temp)) j--;
        if( i < j) 
        {
            Array[i] = Array[j];
            i++;
        }
        while((i < j) && (Array[i] <= temp)) i++;
        if( i < j)
        {
            Array[j] = Array[i];
            j--;
        }
    }
    Array[i] = temp;
    return i;
}
void QuickSort(int *Array, int n)
{
    if(n == 0)
        return;//递归出口
    int i = Partition(Array, n);
    QuickSort(Array, i);
    QuickSort(Array+i+1, n-i-1);
}

void ShellSort(int *Array, int n)//希尔排序
{
    int d = n;
    int temp;
    int k;

    while(d > 1)
    {
        d = (d+1) / 2;
        for(int i=0; i < d; i++)
        {
            for(int j=i+d; j<n; j+=d)
            {
                if(Array[j] >= Array[j-d]) 
                    continue;
                temp = Array[j];
                k = j-d;
                do
                {
                    Array[k+d] = Array[k];
                    k-=d;
                }while(k >= 0 && Array[k] > temp);
                Array[k+d] = temp;//插入到本趟排序正确位置
            }
        }
    }
}

void SelectSort(int *Array, int n)//直接选择排序
{
    int i, j, k;
    int temp;
    for(i=0; i < n-1; i++)
    {
        k = i;
        for(j = k+1; j <= n-1; j++)
        {
            if(Array[j] < Array[k]) 
                k = j;
        }
        if( k != i)
        {
            temp = Array[i];
            Array[i] = Array[k];
            Array[k] = temp;
        }
    }
}

void Sift(int *Array, int start, int end)//希尔排序
{
    int i, j;
    int temp;
    temp = Array[start];
    i=start; 
    j=2*i;
    while(j < end)
    {
        if(j < end-1 && Array[j] < Array[j+1])
            j++;
        if(temp >= Array[j])
            break;
        Array[i] = Array[j];
        i = j;
        j = 2*i;
    }
    Array[i] = temp;
}
void HeapSort(int *Array, int n)
{
    int i;
    int temp;
    for(i=n/2-1; i >= 0; i--)
        Sift(Array, i, n);
    for(i=n-1; i>=1; i--)
    {
        temp = Array[0];
        Array[0] = Array[i];
        Array[i] = temp;
        Sift(Array, 0, i-1);
    }
}

void Merge(int *Array, int *ArrayTemp, int low, int mid, int high)//二路归并排序
{
    int i, j, k;
    i=low;
    j=mid+1;
    k = low;
    while(i <= mid && j <= high)
    {
        if(Array[i] <= Array[j])
            ArrayTemp[k++] = Array[i++];
        else
            ArrayTemp[k++] = Array[j++];
    }
    while(i <= mid)
        ArrayTemp[k++] = Array[i++];
    while(j <= high)
        ArrayTemp[k++] = Array[j++];
}
void MergePass(int *Array, int *ArrayTemp, int n, int len)
{
    int i;
    i=0;
    while(i+2*len-1 < n)
    {
        Merge(Array, ArrayTemp, i, i+len-1, i+2*len-1);
        i = i + 2*len;
    }
    if(i+len-1 < n-1)
        Merge(Array, ArrayTemp, i, i+len-1, n-1);
    else
        for(int j=i; j<n; j++)
            ArrayTemp[j] = Array[j];
}
void MergeSort(int *Array, int n)
{
    int len = 1;
    int ArrayTemp[SIZE];;
    while(len < n)
    {
        MergePass(Array, ArrayTemp, n, len);
        len = len*2;
        MergePass(ArrayTemp, Array, n, len);
        len = len*2;
    }
}

 

推荐阅读