八大排序算法---冒泡排序、选择排序

冒泡排序

基本思想:从前往后依次比较相邻元素的值,值大的往后交换,最后排序的数组从小到大排列
时间复杂度O(n^2)

package buttlepaixu;
import java.util.Arrays;
public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = new int[]{3,9,-1,10,20};
        //一共进行 arr.length-1次大的循环
        for(int i = 0;i<arr.length-1;i++){
        //每次大的循环内,进行两两比较
            for(int j = 0;j<arr.length-i-1;j++){
                if(arr[j]>arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

优化:
在进行排序的过程中可能会出现一趟下来没有进行交换的情况,说明数组有序;因此,可以设置一个flag标志位来表明元素是否发生交换,从而减少不必要的比较
优化后的代码:

package buttlepaixu;
import java.util.Arrays;
public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = new int[]{3,9,-1,10,20};
        int temp = 0;
        boolean flag = false;//记录是否发生过交换
        //一共进行 arr.length-1次大的循环,迭代多少轮
        for(int i = 0;i<arr.length-1;i++){
        //每次大的循环内,进行两两比较,一轮里面交换的次数
            for(int j = 0;j<arr.length-i-1;j++){
                if(arr[j]>arr[j+1]){
                	flag = ture;
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
            if(!flag){//flag = false;表示一次交换都没有发生
            	break;
            }else{
				flag = fasle;//重置flag
			}
        }
        
        System.out.println(Arrays.toString(arr));
    }
}

选择排序

时间复杂度O(n^2)
基本思想:第一步:先从arr[0]~arr[n-1]中选出最小的数,然后与arr[0]进行交换。第二步:从arr[1]到arr[n-1]中找出最小的数和arr[1]进行交换。第三步:从arr[2]到arr[n-1]中找出最小的数与arr[2]进行交换。。。以此类推,经过arr.length-1躺排序结束。
原始数组:101,34,119,1,2
第一轮:1,34,119,101,2//{101,34,119,1,2}
第二轮:1,2,119,101,34//{34,119,101,2}
第三轮:1,2,34,101,119//{119,101,34}
第四轮:1,2,34,101,119//{101,119}

import java.util.Arrays;
public class SelectSort {
    public static void main(String[] args) {
        int[] arr = new int[]{101,34,119,1,-1,90,123};
        int temp = 0;
        for(int i = 0;i<arr.length-1;i++){
            int minIndex = i;
            int min = arr[i];
            for(int j = i+1;j<arr.length;j++){
                if(min>arr[j]){
                    min = arr[j];
                    minIndex = j;
                }
            }
            if(minIndex != i){
                arr[minIndex] = arr[i];
                arr[i] = min;
            }
            System.out.println(Arrays.toString(arr));
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值