数据结构笔记_15 选择排序(简单选择排序、堆排序)

一、简单选择排序

1、思想

从待排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。

2、思路

举个栗子:

在这里插入图片描述
以第一轮排序举例:

先假定第一个数字:101 是最小的数。通过一个循环遍历找出后面的元素中最小的数字。

第一次比较,101>34,更新一下最小数。将最小数 min置为34、最小值索引 minIndex置为2;
第二次比较,34<119,不更新。
第三次比较,34>1,更新一下最小数。将最小数 min置为1、最小值索引 minIndex置为4;

再将101和最小数1的位置互换一下,即可完成第一轮排序。

3、代码

package com.huey.sort;

import java.util.Arrays;

public class SelectSortSolo {
    
    

	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
		int[] arr = {
    
     1111, 111, 11, 1 };
		Select(arr);

	}

	public static void Select(int[] arr) {
    
    
		System.out.println("原始数组为~");
		System.out.println(Arrays.toString(arr));

		for (int i = 0; i < arr.length - 1; i++) {
    
    // 控制次数
			int min = arr[i];// 先假定为最小值,后面再遍历比较、重新赋值
			int minIndex = i;// 同理
			for (int j = 1 + i; j < arr.length; j++) {
    
    
				if (arr[i] > arr[j]) {
    
    // 找到了更小的数字
					// 更新最小值
					min = arr[j];
					minIndex = j;
				}
			}

			// 在进行完一次遍历寻找最小值后,判断一下是否发现了更小的数字
			if (minIndex != i) {
    
    // 找到了更小的数字,下面就要交换次序
				arr[minIndex] = arr[i];// 把原先假定的最小值、后来经比较发现是大的数字,交换到小的位置上【minIndex变量的作用范围比j的范围大】
				arr[i] = min;
			}
			System.out.println("第" + (i + 1) + "次排序后~");
			System.out.println(Arrays.toString(arr));
		}
	}

}

输出结果:
在这里插入图片描述

4、速度测试

package com.huey.sort;

import java.text.SimpleDateFormat;
import java.util.Date;

public class SelectSortSolo {
    
    

	public static void main(String[] args) {
    
    
		// 测试选择排序的速度
		int[] arr = new int[80000];
		for (int i = 0; i < 80000; i++) {
    
    
			arr[i] = (int) (Math.random() * 8000000);// 生成一个[0,8000000)的数
		}

		// 格式化时间
		Date data1 = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String date1Str = simpleDateFormat.format(data1);
		System.out.println("排序前的时间是:" + date1Str);
		System.out.println("正在排序中,请稍后~");
		Select(arr);

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

	}

	public static void Select(int[] arr) {
    
    
		for (int i = 0; i < arr.length - 1; i++) {
    
    // 控制次数
			int min = arr[i];// 先假定为最小值,后面再遍历比较、重新赋值
			int minIndex = i;// 同理
			for (int j = 1 + i; j < arr.length; j++) {
    
    
				if (arr[i] > arr[j]) {
    
    // 找到了更小的数字
					// 更新最小值
					min = arr[j];
					minIndex = j;
				}
			}

			// 在进行完一次遍历寻找最小值后,判断一下是否发现了更小的数字
			if (minIndex != i) {
    
    // 找到了更小的数字,下面就要交换次序
				arr[minIndex] = arr[i];// 把原先假定的最小值、后来经比较发现是大的数字,交换到小的位置上【minIndex变量的作用范围比j的范围大】
				arr[i] = min;
			}
		}
	}

}

结果分析:
在这里插入图片描述
经多次测试,绝大多数是2~3s.

二、堆排序

虫洞传送~

猜你喜欢

转载自blog.csdn.net/qq_45909299/article/details/113816969
今日推荐