0
点赞
收藏
分享

微信扫一扫

选择排序(Java)

是波波呀 2022-05-06 阅读 102

选择排序(Java)

1.概念

2.基本思想

3.思路图解

原始数组:101,34,119,1

第一轮排序:

第二轮排序:

第三轮排序:

说明:

实例:原始数组:3,44,38,5,47,15,36,26,27,2,46,4,19,50,48

4.代码

4.1分析代码

package DataStructures.Sort;

import java.util.Arrays;

public class SelectionSort {
    public static void main(String[] args) {
        int[] arr = {101, 34, 119, 1};
        System.out.println("排序前:" + Arrays.toString(arr));
        selectionSort(arr);
    }

    /**
     * @param arr
     * @author ZJ
     * Description 选择排序
     * date 2022-05-06 11:55:52 11:55
     */
    public static void selectionSort(int[] arr) {
        int minIndex = 0;
        int min = arr[0];

        //第一轮
        for (int j = 0 + 1; j < arr.length; j++) {
            if (min > arr[j]) {
                min = arr[j];//重置最小值
                minIndex = j;//重置最小值下标
            }
        }
        //将最小值放在arr[0],即交换
        arr[minIndex] = arr[0];
        arr[0] = min;
        System.out.println("第一轮后:" + Arrays.toString(arr));

        //第二轮
        minIndex = 1;
        min = arr[1];
        for (int j = 1 + 1; j < arr.length; j++) {
            if (min > arr[j]) {
                min = arr[j];//重置最小值
                minIndex = j;//重置最小值下标
            }
        }
        //将最小值放在arr[1],即交换
        arr[minIndex] = arr[1];
        arr[1] = min;
        System.out.println("第二轮后:" + Arrays.toString(arr));

        //第三轮
        minIndex = 2;
        min = arr[2];
        for (int j = 2 + 1; j < arr.length; j++) {
            if (min > arr[j]) {
                min = arr[j];//重置最小值
                minIndex = j;//重置最小值下标
            }
        }
        //将最小值放在arr[2],即交换
        arr[minIndex] = arr[2];
        arr[2] = min;
        System.out.println("第三轮后:" + Arrays.toString(arr));
    }
}

4.2优化代码

package DataStructures.Sort;

import java.util.Arrays;

public class SelectionSort {
    public static void main(String[] args) {
        int[] arr = {101, 34, 119, 1};
        System.out.println("排序前:" + Arrays.toString(arr));
        selectionSort(arr);
    }

    /**
     * @param arr
     * @author ZJ
     * Description 选择排序
     * date 2022-05-06 11:55:52 11:55
     */
    public static void selectionSort(int[] arr) {
        int minIndex;
        int min;

        for (int i = 0; i < arr.length - 1; i++) {
            minIndex = i;
            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.printf("第%d轮后:", i + 1);
            System.out.println(Arrays.toString(arr));
        }
    }
}

时间复杂度O(n²)

5.八万数据测试

public static void main(String[] args) {
//        int[] arr = {101, 34, 119, 1};
//        System.out.println("排序前:" + Arrays.toString(arr));
//        selectionSort(arr);

        //80000数据测试
        int[] arr = new int[80000];
        for (int i = 0; i < 80000; i++) {
            arr[i] = (int) (Math.random() * 8000000);//生成[0,8000000)的随机数
        }

        Date date1 = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date1Str = simpleDateFormat.format(date1);
        System.out.println("排序前时间是" + date1Str);

        selectionSort(arr);

        Date date2 = new Date();
        String date2Str = simpleDateFormat.format(date2);
        System.out.println("排序后时间是" + date2Str);
    }

在这里插入图片描述

举报

相关推荐

0 条评论