排序算法-冒泡排序

        冒泡排序是一种基础的排序算法,由于是将元素向末尾移动,立起来看就像是泡泡从底部冒到顶端一样,故取名叫冒泡排序。

        时间复杂度

                最好情况:不需要排序,只需要遍历一次,故为O(N);最坏情况:每一轮都需要最多比较N次,需要比较N轮,所以为O(N^2),冒泡排序是一种稳定排序。

        算法思想

        元素两两比较,较大的元素往后一位移动,然后继续与后面的元素进行两两比较,直到一轮把最大的元素移动到数组末尾,此时末尾元素已经是有序的了,有序的元素不再参与下一轮比较,然后继续按照之前的方法进行两两比较与交换,再将最大的元素往后移动,直到所有的元素都有序。注意,如果一轮中没有发生元素交换,则当前数组已经是有序的,则退出排序过程。

        首先第一轮,从元素2开始,与前一个元素进行比较,元素5大,则交换2和5,然后再到元素7,与前一个元素5进行比较,元素7大,不交换,然后到元素6,与前一个元素7进行比较,元素7大,所以进行交换,再到元素1,与前一个元素7进行比较,元素7大,则交换1和7,再到元素4,与前一个元素7进行比较,元素7大,则交换4和7,再到最后一个元素3,与前一个元素7进行比较,元素7大,则交换3和7,此时第一轮将最大的元素7,冒泡到了顶部;

        第二轮,还是从第二个元素5开始,与前一个元素进行2进行比较,元素5大,不交换,再到元素6,与前一个元素5进行比较,元素6大,不交换,再到元素1,与前一个元素6进行比较,元素6大,则交换元素1和6,再到元素4,与前一个元素6进行比较,元素6大,则交换4和6,再到元素3,与前一个元素6进行比较,元素6大,则交换3和6,此时这一轮将最大的元素6,冒泡到了顶部;

        第三轮到第五轮同理,到第六轮,当比较完前三个元素后发现没有发生交换,则判定当前数组已经有序,此时退出排序过程。

        代码实现

package main

import "fmt"

func bubble_sort(arr []int) {
	if len(arr) <= 1 {
		return
	}
	for i := len(arr) - 1; i >= 1; i-- {
		flag := false
		for j := 1; j <= i; j++ {
			if arr[j] < arr[j-1] {
				arr[j], arr[j-1] = arr[j-1], arr[j]
				flag = true
			}
		}
		if !flag {
			break
		}
		fmt.Println(arr)
	}
}

func main() {
	arr := []int{5, 2, 7, 6, 1, 4, 3}
	bubble_sort(arr)
	fmt.Println(arr)
}

输出:
[2 5 6 1 4 3 7]
[2 5 1 4 3 6 7]
[2 1 4 3 5 6 7]
[1 2 3 4 5 6 7]
[1 2 3 4 5 6 7]

代码将每次排序的过程都打印出来,方便理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值