常用排序算法实现

按平均时间将排序分为四类:


(1)平方阶(O(n2))排序
     一般称为简单排序,例如直接插入、直接选择和冒泡排序;

(2)线性对数阶(O(nlgn))排序
     如快速、堆和归并排序;

(3)O(n1+£)阶排序
     £是介于0和1之间的常数,即0<£<1,如希尔排序;

(4)线性阶(O(n))排序
     如桶、箱和基数排序。

各种排序方法比较

     简单排序中直接插入最好,快速排序最快,当文件为正序时,直接插入和冒泡均最佳。


影响排序效果的因素

     因为不同的排序方法适应不同的应用环境和要求,所以选择合适的排序方法应综合考虑下列因素:
  ①待排序的记录数目n;
  ②记录的大小(规模);
  ③关键字的结构及其初始状态;
  ④对稳定性的要求;
  ⑤语言工具的条件;
  ⑥存储结构;
  ⑦时间和辅助空间复杂度等。


#include <stdio.h>
#include<iostream>
using namespace std;

//交换
void swap(int& a, int& b)
{
    int temp = a;
    a = b;
    b = temp;
}

//不用中间数的交换  ^按位异或 不相同才为真
void swap_(int& a, int& b)
{
    if (a != b)
    {
        a ^= b;
        b ^= a;
        a ^= b;
    }
}

//选择排序
void select_sort(int *array, int left, int right)
{
    if (NULL == array || left >= right) return;
    
    for (int i=left; i<right; ++i)
    {
        for (int j=i+1; j<right; ++j)
        {
            if (array[i] > array[j])
            {
                swap(array[i], array[j]);
            }
        }
    }
}

//冒泡排序
void bubble_sort(int *array, int left, int right)
{
    if (NULL == array || left >= right) return;


    bool flag = false;
    for (int i=left; i<right; ++i)
    {
        for (int j=left+1; j<right-i; ++j)
        {
            if (array[j-1] > array[j])
            {
                swap(array[j-1], array[j]);
                flag = true;
            }
        }
        if (!flag) return;
    }
}

//插入排序
void insert_sort(int *array, int left, int right)
{
    if (NULL == array || left+1 >= right) return;

    for (int i= left + 1; i<right; i++)
    {
        if (array[i - 1] > array[i])
        {
            int temp = array[i];
            int j = i;
            while (j > left && array[j - 1] > temp)
            {
                array[j] = array[j - 1];
                j--;
            }
            array[j] = temp;
        }
    }
}

//希尔排序
void shell_sort(int* array, int left, int right)
{
    if (NULL == array || left+1 > right) return;

    int gap;
    for (gap=(right-left)/2; gap>0; gap/=2)
    {
        for (int i=gap; i<right; ++i)
        {
            if (array[i - gap] > array[i])
            {
                int temp = array[i];
                int j = i - gap;
                for (; j >= 0 && array[j] > temp; j -= gap)
                {
                    array[j + gap] = array[j];
                }
                array[j + gap] = temp;
            }
        }
    }
}

int adjust_array(int* array, int left, int right)
{
    if (NULL == array || left >= right) return 0;

    int i = left;
    int j = right;
    int pos = left;

    while(j > i)
    {
        while(j > i)
        {
            if (array[j] < array[pos])//从右向左找小于基准数,找到则交换位置
            {
                swap(array[j], array[pos]);
                pos = j;
                break;
            }
            j--;
        }

        while(j > i)
        {
            if (array[i] > array[pos])//从左向右找大于基准数,找到则交换位置
            {
                swap(array[i], array[pos]);
                pos = i;
                break;
            }
            i++;
        }
    }


    return pos;
}

//快速排序
void quick_sort(int* array, int left, int right)
{
    if (NULL == array || left >= right) return;

    int pos = adjust_array(array, left, right);
    quick_sort(array, left, pos-1);
    quick_sort(array, pos+1, right);
}

int get_left(int pos)
{
    return (2*pos + 1);
}

int get_right(int pos)
{
    return (2*pos + 2);
}

int get_parent(int pos)
{
    return int(float(pos - 1)/2);
}

void adjust_heap(int* array, int i, int n)
{
    if (NULL == array || i >= n) return;

    int left = get_left(i);
    int right = get_right(i);
    int large = i;

    if (left < n && array[left] > array[large])
    {
        large = left;
    }

    if (right < n && array[right] > array[large])
    {
        large = right;
    }

    if (large != i)
    {
        swap(array[large], array[i]);
        adjust_heap(array, large, n);
    }
}

void build_heap(int* array, int n)
{
    if (NULL == array || n <= 1) return;

    for (int i = n/2 - 1; i >= 0; --i)
    {
        adjust_heap(array, i, n);
    }
}

//堆排序
void heap_sort(int* array, int n)
{
    if (NULL == array || n <= 1) return;
    
    build_heap(array, n);
    for (int i = n - 1; i > 0; --i)
    {
        swap(array[0], array[i]);
        adjust_heap(array, 0, i);
    }
}

void merge_array(int* array, int left, int mid, int right)
{
    if (left > right || left > mid || mid > right) return;

    int i = left;
    int j = mid+1;
    int k = 0;

    int* temp = new int[right - left + 1];
    if (NULL == temp) return;
    
    int m = mid;
    int n = right;
    while(i <= m && j <= n)
    {
        if (array[i] > array[j])
            temp[k++] = array[j++];
        else
            temp[k++] = array[i++];
    }

    while(i <= m)
    {
        temp[k++] = array[i++];
    }

    while(j <= n)
    {
        temp[k++] = array[j++];
    }

    for (int i=0; i<k; ++i)
    {
        array[left+i] = temp[i];
    }

    if (NULL != temp)
    {
        delete []temp;
    }
}

void _merge_sort(int* array, int left, int right)
{
    if (NULL == array) return;

    if (left < right)
    {
        int mid = (left + right)/2;
        _merge_sort(array, left, mid);
        _merge_sort(array, mid+1, right);
        merge_array(array, left, mid, right);
    }
}

//归并排序
void merge_sort(int* array, int n)
{
    if (NULL == array || n <= 1) return;

    _merge_sort(array, 0, n-1);
}


void main()
{
    int array[] = {4, 6, 3, 2, 90, 45, 23};
    int length = sizeof(array)/sizeof(array[0]);
    cout<<"sizeof array: "<<length<<endl;
    cout<<"sort before:"<<endl;
    for (int i=0; i<length; ++i){
        cout<<array[i]<<"\t";
    }
    cout<<endl;

    cout<<"请输入你要排序的算法:"<<endl;
    cout<<"1 选择排序"<<endl;
    cout<<"2 冒泡排序"<<endl;
    cout<<"3 插入排序"<<endl;
    cout<<"4 希尔排序"<<endl;
    cout<<"5 快速排序"<<endl;
    cout<<"6 堆排序"<<endl;
    cout<<"7 归并排序"<<endl;
    
    int n;
    cin>>n;
    switch (n)
    {
    case 1:
        select_sort(array, 0, length);
        break;
    case 2:
        bubble_sort(array, 0, length);
        break;
    case 3:
        insert_sort(array, 0, length);
    break;
    case 4:
        shell_sort(array, 0, length);
        break;
    case 5:
        quick_sort(array, 0, length - 1);
        break;
    case 6:
        heap_sort(array, length);
        break;
    case 7:
        merge_sort(array, length);
        break;
    default:
        break;
    }
    
    cout<<"sort latter:"<<endl;
    for (int i=0; i<length; ++i){
        cout<<array[i]<<'\t';
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值