冒泡、选择、插入、归并、快速排序代码

本文详细介绍了五种常见的排序算法:冒泡排序、选择排序、插入排序、归并排序和快速排序。每种算法都通过C++代码实现,并附有详细的注释帮助理解其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理请查看:http://wuchong.me/blog/2014/02/09/algorithm-sort-summary/

冒泡排序

void bubble_sort(int * array, int len)
{
    int tmp;

    for (int i=0; i<len; ++i)
    {
        for (int j=0; j<(len-i-1); ++j)
        {
            if(array[j+1] < array[j])
            {
                //tmp = array[j+1];
                //array[j+1] = array[j];
                //array[j] = tmp;
                swap(array[j+1], array[j]);
            }
        }
    }
}

选择排序

void selection_sort(int * array, int len)
{
    int tmp;
    int k = 0;

    for (int i=0; i<len; ++i)//从第一个数值开始遍历
    {
        k = i;
        tmp = array[i];
        for (int j=i+1; j<len; ++j)//循环找出最小数值
        {
            if (tmp > array[j])
            {
                tmp = array[j];
                k = j;
            }
        }
        if (i != k)//有找到最小数值,则数据进行交换
        {
            //array[k] = array[i];
            //array[i] = tmp;
            swap(array[k], array[i]);
        }
    }
}

插入排序

void insertion_sort(int * array, int len)
{
    int tmp;

    for (int i=1;i<len;++i)//插入数值遍历
    {
        tmp = array[i];
        for (int j=i-1;j>=0;--j)//以自己一下的数值一个一个比较
        {
            if (array[j] <= tmp)//当比自己大于或等于数据,则插入这个数值前面
            {
                array[j+1] = tmp;
                break;
            }
            else//当比自己小数值,则将数值向前移动一位
            {
                array[j+1] = array[j];
            }

            if(0 == j)//如果比较到最后一个,直接插入自己值。
            {
                array[j] = tmp;
            }
        }

    }
}

归并排序

void Merge(int *vi, int low, int mid, int up)
{
#if 0
    int n1 = mid-low+1;
    int n2 = up-mid;
#else
    int n1 = mid-low;
    int n2 = up-mid+1;
#endif
    int *L = new int[n1+1];
    int *R = new int[n2+1];
    int i, j, k;

//  for (i=0; i<n1; i++){
//      L[i] = vi[low+i];
//  }
//  for (j=0; j<n2; j++){
//      R[j] = vi[mid+j+1];
//  }
#if 0
    memcpy(L, &vi[low], n1*sizeof(int));
    L[n1] = 0x7fffffff;

    memcpy(R, &vi[mid+1], n2*sizeof(int));
    R[n2] = 0x7fffffff;
#else
    memcpy(L, &vi[low], n1*sizeof(int));
    L[n1] = 0x7fffffff;

    memcpy(R, &vi[mid], n2*sizeof(int));
    R[n2] = 0x7fffffff;
#endif

    for (i=0, j=0, k=low; k<=up; k++)
    {
        if (L[i]<=R[j])
        {
            vi[k] = L[i];
            i++;
        }
        else
        {
            vi[k] = R[j];
            j++;
        }
    }

    delete []L;
    delete []R;
}

void MergeSort(int *vi, int low, int up)
{
    if (low < up)
    {
        int mid = (low+up)/2;
        MergeSort(vi, low, mid);
        MergeSort(vi, mid+1, up);
        Merge(vi, low, mid, up);
    }
}

int main()
{
    int array[] = {2,8,7,1,0,10,3};
    int len = sizeof(array);
    MergeSort(array, 0, len-1);
    return 0;
}

快速排序

int partition(int * vi, int low, int up)
{
    int pivot = vi[up];
    int i = low;
    for (int j = low; j < up; j++)
    {
        if(vi[j] <= pivot)
        {
            swap(vi[i], vi[j]);
            i++;
        }
    }
    swap(vi[i], vi[up]);//交换位置,防止同一个位置做基准
    return i;
}

//C++'s array range should be [low, up], the same as [low, up+1)
void quickSort(int * vi, int low, int up)
{
    if(low < up)
    {
        int mid = partition(vi, low, up);
        //mid这个值已经做为基准了,所以后面用mid-1和mid+1;
        //Watch out! The mid position is on the place, so we don't need to consider it again.
        //That's why below is mid-1, not mid! Otherwise it will occur overflow error!!!
        quickSort(vi, low, mid-1);
        quickSort(vi, mid+1, up);
    }
}

int main()
{
    int array[] = {2,8,7,1,0,10,3};
    int len = sizeof(array);
    quickSort(array, 0, len-1);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值