• 常见算法-冒泡排序(鸡尾酒排序)


    冒泡排序

    比较次数为:(n-1) + (n-2) + ... + 1 = n*(n-1) / 2 ==> 时间复杂度为 O(N^2)

    代码
    // 冒泡排序
    /*
    	冒泡排序是一种比较简单的排序算法,它循环走过需要排序的元素,
    	依次比较相邻的两个元素,如果顺序错误就交换,直至没有元素交换,完成排序
    */
    // f1 普通版本
    func f1(t []int,total int)  {
    	for i:=0;i<total;i++ {
    		for j:=0;j<total;j++ {
    			if j+1 < total{
    				if t[j] > t[j+1] {
    					tmp := t[j]
    					t[j] = t[j+1]
    					t[j+1] = tmp
    				}
    			}
    		}
    	}
    	fmt.Println(t)
    }
    
    
    冒泡排序升级版 - 鸡尾酒排序

    每次循环确认一次最大值,最小值,然后不断的缩小比较范围,性能优于冒泡排序,代码比冒泡的多一些

    // f2 鸡尾酒排序
    func f2(t []int,total int)  {
    	left := 0;
    	right := total
    	for  {
    		if left >= right {
    			break
    		}
    		// 正向冒泡 找最大值
    		for j:=left;j<right;j++ {
    			// 比到最后一位的时候,就不用再跟下一位对比了
    			if j+1 < total {
    				// 两个连续的值对比后,前面的值大于后面的时候,需要将两个值进行替换
    				if t[j] > t[j+1] {
    					tmp := t[j]
    					t[j] = t[j+1]
    					t[j+1] = tmp
    				}
    			}
    		}
    		// 上面一轮,已经确认一个最大值,可以缩小范围
    		right--
    		// 反向冒泡,取最小值
    		for j:=right;j>left;j-- {
    			// 如果
    			if j != left {
    				if t[j] < t[j-1] {
    					tmp := t[j]
    					t[j] = t[j-1]
    					t[j-1] = tmp
    				}
    			}
    		}
    		// 确认最小值 ,缩小范围
    		left ++
    	}
    	fmt.Println(t)
    }
    
    欢迎留言评论~
  • 相关阅读:
    MFC-窗口指针
    MFC-EditControl文本控件(多行输入)一行一行读取
    MFC-文件对话框
    MFC-ToolBar工具栏
    MFC-CMenu菜单
    MFC-访问对话框控件的七种方法
    CC++:scanf的用法
    C/C++:printf的用法
    C/C++:创建第一个程序helloworld!
    NX二次开发-NX客户机与服务器FTP上传下载文件
  • 原文地址:https://www.cnblogs.com/issac-fan/p/12659864.html
Copyright © 2020-2023  润新知