交换排序算法

数据结构课程中的两种简单的交换排序算法(冒泡排序,快速排序)。

交换排序算法的思想:两两比较待排序的关键字,并交换不满足次序要求的偶对,直到全部满足为止。(结合实践理解思想,思想不是用来记忆的)

1、冒泡排序

思想:对于给定的一个关键字序列a[0,1,2...n],从第一个位置的元素a[0]开始,一路遍历一路两两比较,把不满足次序要求的偶对交换过来,这样一趟下来便会将最大值定位于最后位置a[n-1];相同的思路,定位a[n-2];以此类推,最后将元素全部归位,排序结束。

算法:对一个数组进行排序的冒泡排序算法如下:

<span style="font-size:14px;">//冒泡排序
void BubbleSort(int a[],int n)
{
        int i,j,temp,tag;
        for(i=1;i<n;i++)//比较n-1次
        {
                tag=0;
                for(j=0;j<n-i;j++)
                        if(a[j]>a[j+1])
                        {
                                temp=a[j];
                                a[j]=a[j+1];
                                a[j+1]=temp;
                                tag=1;
                        }
                if(tag==0)   break;
        }
}
</span>
总结:冒泡排序相关性能如下表,当初始数据序列为正序时,效率最高;反序时效率最低。


2、快速排序

思想:对于给定的一个关键字序列,一般取第一个元素为基准(也可以去中间元素为基准),然后将其他元素中大于基准的元素全部排在基准右侧,而小于基准的元素排在基准左侧,这样将基准元素归位;用同样的方法递归处理基准左侧和右侧元素,最后排序结束。具体做法结合算法理解,将算法读懂之后理解思想。

算法:对一个一维数组进行快速排序:

<span style="font-size:14px;">//快速排序
void QuickSort(int a[],int low,int high)
{
        int i=low,j=high,temp;
        if(low<high)
        {
                temp=a[low];//以第一个元素作为基准
                while(i!=j)//左右两个指示器(先右后左)
                {
                        while(j>i&&a[j]>temp)
                                j--;
                        a[i]=a[j];
                        while(i<j&&a[i]<temp)
                                i++;
                        a[j]=a[i];

                }
                a[i]=temp;//归位一个元素
                QuickSort(a,low,i-1);//递归处理左侧元素
                QuickSort(a,i+1,high);//递归处理右侧元素
        }

}</span>
总结:当数据越是随机分布时,快速排序算法的性能越好;当数据越接近有序时,快速排序算法的性能最差。


最后关于算法的测试:

/*交换排序算法*/
#include <iostream>
using namespace std;

//冒泡排序
void BubbleSort(int a[],int n)
{
        int i,j,temp,tag;
        for(i=1;i<n;i++)//比较n-1次
        {
                tag=0;
                for(j=0;j<n-i;j++)
                        if(a[j]>a[j+1])
                        {
                                temp=a[j];
                                a[j]=a[j+1];
                                a[j+1]=temp;
                                tag=1;
                        }
                if(tag==0)   break;
        }
}

//快速排序
void QuickSort(int a[],int low,int high)
{
        int i=low,j=high,temp;
        if(low<high)
        {
                temp=a[low];//以第一个元素作为基准
                while(i!=j)//左右两个指示器(先右后左)
                {
                        while(j>i&&a[j]>temp)
                                j--;
                        a[i]=a[j];
                        while(i<j&&a[i]<temp)
                                i++;
                        a[j]=a[i];

                }
                a[i]=temp;//归位一个元素
                QuickSort(a,low,i-1);//递归处理左侧元素
                QuickSort(a,i+1,high);//递归处理右侧元素
        }

}

//测试函数
int main()
{
        int a[10]={144,232,111,678,329,834,123,230,567,431};
        cout<<"排序之前的数组元素为:";
        for(int i=0;i<10;i++)
                cout<<a[i]<<"  ";
        cout<<endl;

        //BubbleSort(a,10);
        QuickSort(a,0,9);

        cout<<"排序之后的数组元素为:";
        for(int i=0;i<10;i++)
                cout<<a[i]<<"  ";
        cout<<endl;

}
运行结果为:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值