数据结构-排序算法之交换排序(冒泡排序快速排序)

数据结构-排序算法之交换排序(冒泡排序,快速排序)

排序算法: 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减排列起来的操作。
交换排序:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。

  • 冒泡排序:从左到右扫描要排序的元素,比较两个相邻元素的排序码,当他们的顺序不符合要求时,交换这两个元素的位置第一趟冒泡后最大(小)的元素被冒到最下面(上面),对剩余元素重复以上过程直到所有元素有序为止。
  • 快速排序:是对冒泡排序的一种改进,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。。

冒泡排序算法

算法思想:

  • 从左到右扫描要排序的元素,比较两个相邻元素的排序码,当他们的顺序不符合要求时,交换这两个元素的位置第一趟冒泡后最大(小)的元素被冒到最下面(上面),对剩余元素重复以上过程直到所有元素有序为止。

  • 时间复杂度:冒泡排序算法的时间复杂度为O(N2)。

  • 算法的稳定性:相信你不会把相等的元素交换,故冒泡排序是稳定的排序算法

算法实现 算法的c++实现,实现代码来自王治和教授数据结构课堂的总结

void bubble_sort(){
    for(int i=1;i<n;i++){
        bool flag;
        flag=false;
        for(int j=0;j<n-i;j++){
            if(entry[j]>entry[j+1]){
                flag=true;
                temp=entry[j];
                entry[j]=entry[j+1];
                entry[j+1]=temp;
            }
        }
        if(!flag)
            break;
    }
} 

快速排序算法

算法思想:

  • 选择某个要排序的元素作为基准。

  • 把要排序的元素划分为两组,前一组元素的排序码均小于基准元素的排序码,后一组元素的排序码均大于基准元素的排序码。

  • 分别对以上两个较小的子表按同样的方法排序个,这样整个表就有序了。

  • 时间复杂度:快速排序算法的时间复杂度为O (nlogn)

  • 算法的稳定性:快速排序算法是一种不稳定的排序算法。

算法的C++实现

#include <iostream>

using namespace std;

void Qsort(int a[], int low, int high)
{
    if(low >= high)
    {
        return;
    }
    int first = low;
    int last = high;
    int key = a[first];/*用字表的第一个记录作为枢轴*/

    while(first < last)
    {
        while(first < last && a[last] >= key)
        {
            --last;
        }

        a[first] = a[last];/*将比第一个小的移到低端*/

        while(first < last && a[first] <= key)
        {
            ++first;
        }

        a[last] = a[first];    
/*将比第一个大的移到高端*/
    }
    a[first] = key;/*枢轴记录到位*/
    Qsort(a, low, first-1);
    Qsort(a, first+1, high);
}
int main()
{
    int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};

    Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);/*这里原文第三个参数要减1否则内存越界*/

    for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    {
        cout << a[i] << "";
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值