选择排序、冒泡排序

本文介绍了两种基础排序算法——选择排序和冒泡排序,详细解析了它们的思路、伪代码及Java实现。对于选择排序,其时间复杂度为O(n^2),而冒泡排序通过添加change变量实现了优化,当遍历未发生交换时提前结束排序。
摘要由CSDN通过智能技术生成

选择排序

思路

选择排序开始的时候,我们扫描整个列表,找到它的最小元素,然后和第一个元素交换,将最小元素放在它在有序表中的最终位置。然后我们从第二个元素开始扫描列表,找到最后n-1个元素中的最小元素,再和第二个元素交换位置,把第二小的元素放在它的最终位置

伪代码:

SelectionSort(A[0...n-1])
	//该算法用选择排序对给定的数组排序
	//输入:一个可排序的数据A[0...n-1]
	//输出:升序排序的数组A[0...n-1]
	for i <- 0 to n-2 do
		min <- i
		for j <- i+1 to n-1 do
			if A[j] < A[min] 
				min <- j
		swap A[i] and A[min]

显然,对于任何输入来说,选择排序都是一个时间复杂度为 n 2 n^2 n2的算法

Java代码实现

public class SelectSort {

    public static void main(String[] args) {
        int[] a = {43,54,3,6,34};
        Sort(a);
        System.out.println(Arrays.toString(a));
    }

    public static void Sort(int[] arr){
        int min = 0;
        int len = arr.length;
        for (int i=0;i<len-1;i++){
            min = i;
            for (int j = i+1;j<len;j++){
                if (arr[j]<arr[min]) min = j;
            }
            int temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
    }
}

结果如下:
在这里插入图片描述

冒泡排序

思路

比较表中相邻元素,如果它们是逆序的话,就交换它们的位置。重复多次以后,最终,最大的元素就“沉到”列表的最后一个位置。第二遍操作将第二大的元素沉下去。以此类推,知道第n-1遍操作完成时,该列表就排好序了

伪代码

BubbleSort(A[0...n-1]
	//该算法用冒泡排序对数组A[0...n-1]进行排序
	//输入:一个可排序数组A[0...n-1]
	//输出:升序排列的数组A[0..n-1]
	for i <- 0 to n-2 do
		for j <-0 to n-2-i do
			if A[j+1] < A[j]
				swap A[j] and A[j+1]

Java代码实现

public class BubbleSort {
    public static void main(String[] args) {
        int[] a = {43,54,3,6,34};
        Sort(a);
        System.out.println(Arrays.toString(a));
    }

    public static void Sort(int[] arr){
        int len = arr.length;
        for (int i=0;i<len-1;i++){
            for (int j = 0; j< len-1-i;j++){
                if (arr[j+1]<arr[j]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }
}

结果如下:
在这里插入图片描述

改进

public static void Sort2(int[] arr){
        int len = arr.length;
        for (int i=0;i<len-1;i++){
        	//添加了change变量,记录是否发生过交换
            boolean change = false;
            for (int j = 0; j< len-1-i;j++){
                if (arr[j+1]<arr[j]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                    //发生交换,赋值为true
                    change = true;
                }
            }
            //如果change=false则结束排序
            if (change==false) return;
        }
    }

该改进思路最难理解的大概就是change变量的设置,但是我们不妨回看一下冒泡排序的概念。冒泡排序每一次都会遍历检查逆序的情况,如果相邻元素逆序,则交换两元素,如果某次遍历检查不发生交换,不就是表示已经没有逆序的情况了那吗?自然也就是完成排序了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绿豆蛙给生活加点甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值