理论基础 —— 排序 —— 鸡尾酒排序

【概述】

鸡尾酒排序也称定向冒泡排序,是一种稳定的排序方法,其是原始冒泡排序的改进,也是交换排序的一种。

定向冒泡排序与冒泡排序的不同在于其从低到高比较,然后再从高到低比较,如此循环往复,直到序列有序,而冒泡排序仅是从低到高的去比较序列中的每个元素。

其实现借助两个指针来完成,一个作为头指针,负责从前向后扫描,一个作为尾指针,负责从后向前扫描,外层循环依靠指针控制数组左右边界,内层循环分别控制前后边界的排序。

【过程】

初始关键字:  『 6,5,3,1,8,7,2,4  』

第一趟排序:  『 65,3,1,8,7,2,4  』

                        5,『 63,1,8,7,2,4』

                        5,3,『 61,8,7,2,4』

                        5,3,1,『 68,7,2,4』

                        5,3,1,6,『 87,2,4』

                        5,3,1,6,7,『 82,4』

                        5,3,1,6,7,2,『 84

                        5,3,1,6,7,2,4,『 8

第二趟排序:『 5,3,1,6,7,24,8

                      『 5,3,1,6,72,4,8

                      『 5,3,1,627,4,8

                      『 5,3,12,6,7,4,8

                      『 5,312,6,7,4,8

                      512,3,6,7,4,8

                      『 12,5,3,6,7,4,8

第三趟排序: 125,3,6,7,48

                       12,53,6,7,48

                       123,56,7,48

                       1,2,3,5,67,48

                       1,2,3,5,6,748

                       1,2,3,5,6,4,78

第四趟排序: 12,3,5,647,8

                       12,3,54,6,7,8

                       12,34,5,6,7,8

                       123,4,5,6,7,8

                       12,3,4,5,6,7,8

第五趟排序: 1,234,5,67,8

                       1,2,3,4567,8

                       1,2,3,4,567,8

                       1,2,3,4,567,8

第六趟排序: 1,2,3456,7,8

                       1,2,34,56,7,8

                       1,2,34,56,7,8

第七趟排序:  1,2,3,456,7,8

结果:   『  1,2,3,4,5,6,7,8  』

     

                       宏观过程

【时空复杂度分析】

最好的情况,是要排序的表本身就是有序的,只需要进行 n-1 次比较,没有数据交换,因此最优时间复杂度为 O(n)

最坏的情况,是要排序的表是逆序的情况,因此供需比较 n(n-1)/2 次,并作等数量级的记录移动,因此最坏时间复杂度为 O(n^2)

而在平均情况下,时间复杂度与最坏时间复杂度同数量级,即平均时间复杂度为 O(n^2)

此外,定向冒泡排序仅需一个辅助空间,用于作记录交换的暂存单元,即空间复杂度为 O(1)

【源程序】

void cocktailSort(int a[],int n){
    int left=1,right=n;
    while(left<right){
        /*前半轮,将最大元素放到后面*/
        for(int i=left;i<right;i++)
            if(a[i]>a[i+1])
                swap(a[i],a[i+1]);
        right--;
        /*后半轮,将最小元素放到前面*/
        for(int i=right;i>left;i--)
            if(a[i-1]>a[i])
                swap(a[i],a[i-1]);
        left++;

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值