第八章 排序—交换排序

第八章 排序—交换排序

数据结构 基础代码(严蔚敏 人邮出版社)

冒泡排序

#include <iostream>
using namespace std;
int bubbleSort (int A[],int N)
{
    int sw=0;
    bool flag=1;
    for(int i=0;flag;i++)//c++中的for循环,for(init;condition;increment)init 会首先被执行,且只会执行一次。
    {                    //接下来判断condition 若为真,则执行循环主体。反之不执行循环主体。在执行完 for 循环主体后,跳回上面的 increment 语句。
        flag=0;          //flag为1,执行循环,flag改变。
        for(int j=N-1;j>=i+1;j--)//从数组最末尾结点开始起泡,只要j的位置在i位置后面就比较交换。
        {
            if(A[j]<A[j-1])      //如果比前一个小就换
            {
                swap(A[j],A[j-1]);
                flag=1;          //发生交换flag标志发生改变。
                sw++;            //交换一次SW+1
            }
        }
    }
    return sw;
}
int main()
{
    int A[100],N,sw;         //定义局部变量N,sw,数组A[] 注意:main函数内的变量也是局部变量,只是声明周期和全局变量一样长。
    cin >> N;
    for(int i=0;i<N;i++)
    {
        cin >> A[i];
    }
    sw=bubbleSort(A,N);
    for(int i=0;i<N;i++)
    {
        if(i)
        {
            cout <<" ";
        }
         cout <<A[i];
    }
    cout << endl;
    cout << sw << endl;
    return 0;
}

在这里插入图片描述
输入数组个数为 5
数组A[5]={5 2 4 3 1}
冒泡排序后的结果为 1 2 3 4 5
排序共计进行8次交换。

快速排序

//快速排序
#include <iostream>
using namespace std;

int Partition (int A[],int low,int high)
{
    int v=A[low];       //用子表第一个记录来作为枢轴记录
    int pivotkey = A[low];//枢轴记录的关键字保存在pivotkey中。
    while (low<high)       //当low的值大于等于high的时候证明两端交替扫描结束,找到合适位置。
    {
        while(low<high && A[high]>=pivotkey) //如果右端的值大于等于枢轴的值,继续从右向左扫描。
        {
            --high;
        }
        A[low]=A[high];                      //否则把右端的值移动到左端。
        while(low<high && A[low]<=pivotkey) //如果左端的值小于等于枢轴的值,继续从左向右扫描。
        {
            ++low;
        }
        A[high]=A[low];                     //否则把左端的值移动到右端
    }
    A[low]=v;                               //把枢轴的值插入到合适的位置,此时枢轴左端的值均小于等于枢轴的值
    return low;                             //枢轴右端的值均大于等于枢轴的值。
}
void Qsort(int A[],int low,int high)          
{
    int pivotloc;
    if(low<high)                            //表长大于1,进行排序
    {
        pivotloc= Partition(A,low,high);    //将表一分为2
        Qsort(A,low,pivotloc-1);            //左子表继续递归排序
        Qsort(A,pivotloc+1,high);           //右子表继续递归排序
    }
}
void QuickSort(int A[],int N)
{
    Qsort(A,0,N);
}
int main()
{
    int i,N;
    int A[100];
    cin >> N;
    for(i=0;i<N;i++)
    {
        cin >> A[i];
    }
    //sw=bubbleSort(A,N);
    QuickSort(A,N);
    for(i=0;i<N;i++)
    {
        if(i)
        {
            cout<<" ";
        }
        cout << A[i];
    }
    cout <<endl;
    //cout << sw;
}

在这里插入图片描述
结果输出如上图,元素个数输入5 表内元素为 5 3 2 4 1.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值