冒泡,选择,插入排序算法C++实现

void Swap(int &a, int &b)
{
    int Temp = a;
    a = b;
    b = Temp;
}

void ShowSortResult(int *Array, int ArraySize)
{
    for (int k = 0; k < ArraySize; ++k)
        cout << Array[k] << " ";
    cout << endl;
}

/*
冒泡排序的原理:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面,逐次比较,
直至将最大的数移到最后。最将剩下的N-1个数继续比较,将次大数移至倒数第二位。依此规律,直至比较结束。
冒泡最大放后排
*/
void BubbleSort(int *Array, int ArraySize)
{
    for (int i = 0; i < ArraySize; ++i)
    {
        for (int j = 0; j < ArraySize - i - 1; ++j)  //第一趟将最大数挑出来,排到了最后
        {
            if (Array[j] > Array[j + 1])
                Swap(Array[j], Array[j + 1]);
        }
        ShowSortResult(Array, ArraySize);
    }
}
/*
选择排序的原理:每次在无序队列中“选择”出最小值,放到有序队列的最后,并从无序队列中去除该值。
选择最小放前排
*/
void SelectionSort(int *Array, int ArraySize)
{
    for (int i = 0; i < ArraySize; ++i)
    {
        int min = i;
        for (int j = i + 1; j < ArraySize; ++j)
        {
            if (Array[min] > Array[j])
                min = j;
        }
        if (min != i)
            Swap(Array[min], Array[i]);
        ShowSortResult(Array, ArraySize);
    } 
}
/*
插入排序的原理:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的
移动数据,空出一个适当的位置,把待插入的元素放到里面去。
1〉从第一个元素开始,该元素可以认为已经被排序
2〉取出第一个未排序元素存放在临时变量temp中,在已经排序的元素序列中从后往前扫描,逐一比较
3〉如果temp小于已排序元素,将该元素移到下个位置
4〉重复步骤3〉,直到找到已排序的元素小于或者等于
*/
void InsertSort(int *Array, int ArraySize)
{
    for (int i = 1; i < ArraySize; ++i)  //从第一个元素开始,第0个默认有序
    {
        int temp = Array[i];             //将第一个元素放入临时变量中
        int j;
        for (j = i - 1; j >= 0; j--)     //需要比较i次,但是因为需要向后移动,所以从i-1开始,>=0结束
        {
            if (temp < Array[j])         //如果临时变量小于当前值,则将当前值向后移动一位
                Array[j + 1] = Array[j];
            else                         //如果临时变量大于当前值,说明找到位置了,跳出循环
                break;
        }
         Array[j+1] = temp;              //将临时变量放在j+1的位置上
    }
}

int main()
{
    int TestArray[10] = { 4, 12, 12, 45, 3, 9, 22, 56, 32, 14 };
    int ArrayLength = sizeof(TestArray) / sizeof(int);
    
    /*******************************************/
    /*           BubbleSort                    */
    /*******************************************/
    //cout << "Before Sort :";
    //ShowSortResult(TestArray, ArrayLength);
    //
    //BubbleSort(TestArray, ArrayLength);
    //
    //cout << "After Sort :";
    //ShowSortResult(TestArray, ArrayLength);
    
    /*******************************************/
    /*           SelectionSort                 */
    /*******************************************/
    //cout << "Before Sort :";
    //ShowSortResult(TestArray, ArrayLength);

    //SelectionSort(TestArray, ArrayLength);

    //cout << "After Sort :";
    //ShowSortResult(TestArray, ArrayLength);

    /*******************************************/
    /*           InsertSort                 */
    /*******************************************/
    cout << "Before Sort :";
    ShowSortResult(TestArray, ArrayLength);

    InsertSort(TestArray, ArrayLength);

    cout << "After Sort :";
    ShowSortResult(TestArray, ArrayLength);
    
    system("pause");
    return 0;
}

参考文章:

http://blog.csdn.net/xcbeyond/article/details/7341562

http://blog.csdn.net/wdkirchhoff/article/details/41787145

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值