排序算法

部分排序算法的练习。

#include <iostream>
#include <cstring>
using namespace std;

#define N 100

int elem[N];//待排序数组
int n;//实际元素个数

//Input
void Input()
{
    cin >> n;
    for( int i = 0 ; i < n ; i++ )
    {
        cin >> elem[i];
    }
}

//Output
void Output()
{
    for( int i = 0 ; i < n ; i++ )
    {
        cout << elem[i] << " ";
    }
    cout << endl;
}

//交换元素
void swap(int *p,int *q)
{
    int t;
    t = *p;
    *p = *q;
    *q = t;
}

//冒泡排序
void BubbleSort(int elem[],int n)
{
    for(int i = 0 ; i < n-1 ; i++ )
    {
        for(int j = n-1 ; j > i ; j-- )
        {
            if( elem[j] < elem[j-1] )
            {
                swap( &elem[j] , &elem[j-1] );
            }
        }
    }
}

//插入排序
void InsertSort(int elem[],int n)
{
    for( int i = 1 , j ; i < n ; i++ )
    {
        int tmpElem = elem[i];
        for( j = i-1 ; j >= 0 && elem[j] > tmpElem ; j-- )
        {
                elem[j+1] = elem[j];
        }
        elem[j+1] = tmpElem;
    }
}

//选择排序
void SelectSort(int elem[],int n)
{
    for( int i = 0 ; i < n-1; i++ )
    {
        int min = elem[i];
        int minIndex = i;
        for( int j = i+1 ; j < n ; j++ )
        {
            if( elem[j] < min )
            {
                min = elem[j];
                minIndex = j;
            }
        }
        elem[minIndex] = elem[i];
        elem[i] = min;
    }
}

//合并排序
void Merge(int elem[],int p,int q,int r)
{
    int i,j,k;

    int len1 = q-p+1;
    int len2 = r-q;

    int L[N];
    int R[N];;

    for( i = 0 ; i < len1 ; i++ )
        L[i] = elem[ p + i ];

    for( j = 0 ; j < len2 ; j++ )
        R[j] = elem [ q + j + 1 ];

    for( i = 0 , j = 0 , k = p ; i < len1 && j < len2 ; k++ )
    {
        if( L[i] <= R[j] )
        {
            elem[k] = L[i];
            i = i+1;
        }
        else
        {
            elem[k] = R[j];
            j = j+1;
        }
    }

    while( i < len1 )
    {
        elem[k] = L[i];
        i = i+1;
        k = k+1;
    }

    while( j < len2 )
    {
        elem[k] = R[j];
        j = j+1;
        k = k+1;
    }
}

void MergeSort(int elem[],int p,int r)
{
    if( p < r )
    {
        int q = ( p + r ) / 2;
        MergeSort( elem , p , q );
        MergeSort( elem , q+1, r );
        Merge( elem , p , q , r );
    }
}

//快速排序
int Partition(int elem[],int p,int r)
{
    int x = elem[r];
    int i = p - 1;
    for( int j = p ; j <= r-1 ; j++ )//划分出三个集合 1.{ 下标 p to i | 小于x集合 } 2.{ 下标 j to r-1 | 大于x集合 } 3.{ x | 中值元素 }
    {
        if( elem[j] <= x )
        {
            i = i + 1;
            swap( &elem[i] , &elem[j] );
        }
    }
    swap( &elem[i+1] , &elem[r] );
    return i+1;
}

void QuickSort(int elem[],int p,int r)
{
    if( p < r )
    {
        int q = Partition( elem , p , r );
        QuickSort( elem , p , q-1 );
        QuickSort( elem , q , r );
    }
}

//递归版的插入排序
void Insert(int elem[],int start,int len,int val)
{
    int i;
    for( i = len ; i >= 0 && elem[i] > val ; i-- )
    {
        elem[i+1] = elem[i];
    }
    elem[i+1] = val;
}

void CurInsertSort(int elem[],int start,int n)
{
    if( n >= 1 )
    {
        CurInsertSort( elem , 0 , n-1 );//递归排序前n-1个元素
        Insert( elem , 0 , n - 1 , elem[n] );//再将elem[n]插入到数组中
    }
}

//堆排序
int heap_size;//堆的大小

int parent(int i)
{
    return i>>1;
}

int left(int i)
{
    return i<<1;
}

int right(int i)
{
    return i<<1 + 1;
}

void MaxHeapify(int elem[],int i)
{
    int l = left(i);
    int r = right(i);
    int largest;
    if( l <= heap_size && elem[l] > elem[i] )
    {
        largest = l;
    }
    else
    {
        largest = i;
    }

    if( r <= heap_size && elem[r] > elem[largest] )
    {
        largest = r;
    }

    if( largest != i )
    {
        swap( &elem[i] , &elem[largest] );
        MaxHeapify( elem , largest );
    }

}

void BuildMaxHeap(int elem[],int n)
{
    heap_size = n;
    for( int i = n/2 ; i >= 1 ; i-- )
    {
        MaxHeapify( elem , i );
    }
}

void HeapSort(int elem[],int n)
{
    BuildMaxHeap(elem,n);
    for( int i = n ; i >= 2 ; i-- )
    {
        swap( &elem[1] , &elem[i] );
        heap_size = heap_size - 1;
        MaxHeapify( elem , 1 );
    }
}


int main()
{
    Input();
    BubbleSort( elem , n );
    InsertSort( elem , n );
    SelectSort( elem , n );
    MergeSort( elem , 0 , n-1 );
    QuickSort( elem , 0 , n-1 );
    CurInsertSort( elem , 0 , n-1 );
    HeapSort( elem , n-1 );// 从1开始排序
    Output();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值