SelectionSort 选排和其增强版(自我理解)

本文介绍了选择排序算法的基本思想和实现,指出其时间复杂度为O(n的平方),空间复杂度为O(1),并讨论了算法的不稳定性。作者通过实践深化了对算法的理解,并提出了强化版的选择排序,即同时找出最小和最大的元素。文中分享了实现过程中的挑战与收获,并鼓励读者共同学习和进步。
摘要由CSDN通过智能技术生成

从今天开始每天更新一个算法,包括思想和代码

选择排序 :

时间复杂度O(n的平方) 空间复杂度O(1) 不稳定

算法思想:

使用一个索引minPtr默认指向arr[0],遍历数组,当遇见比arr[minPtr]小的将minPtr指针指向比那个小的位置,之后和arr[起始]交换 .
之后依次将较小的选出进行交换

package demo;

import java.util.Arrays;
import java.util.Random;



public class SelectionSort {
	/*
	 * 选择排序     时间复杂度O(n的平方)  空间复杂度O(1)  不稳定
	 * 思想:使用一个索引minPtr默认指向arr[0]遍历数组,当遇见比arr[minPtr]小的将minPtr指针指向新位置,
	 * 最后和arr[0]交换  之后依次将较小的选出进行交换 
	 * 
	 * */
	public static void main(String[] args) {
		check();
		
	}
	static void selectionSort(int[] arr) {
		for(int i=0;i<arr.length-1;i++) {
			int minPtr = i;
			for(int j=i+1;j<arr.length;j++) {
				minPtr = arr[j]<arr[minPtr]? j:minPtr;
			}
			if(minPtr!=i) swap(arr,i,minPtr);//这里加不加判断都可以
		}
	}
	
	//交换数组中的两个值
	static void swap(int[] arr,int a, int b) {
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}
	
	//随机生成一个长度为1000的数组
	static int[] generaterRandomArray() {
		Random r = new Random();
		int[] arr = new int[1000];
		for (int i=0;i<arr.length;i++) {
			arr[i] = r.nextInt(1000000);//随机生成1000000以内的随机数
		}
		return arr;
	}
	//对数器
	public static void check() {
		boolean same = true;
		for(int times = 0; times < 1000; times++) {
			int[] arr = generaterRandomArray();
			int[] arr2 = new int[arr.length];
			System.arraycopy(arr, 0, arr2, 0, arr.length);
			
			Arrays.sort(arr);//使用数组给我们封装好的排序
			selectionSort(arr2);
			
			
			for (int i = 0; i < arr2.length; i++) {
				if(arr[i] != arr2[i]) same = false;
			}
		}
		System.out.println(same == true ? "right" : "wrong");
	}
}

结果是:在这里插入图片描述
只是比较简单的一种排序方式,出于提升自己我们可以进行强化
这是单单选出一个minPtr (指向最小数的指针)
有的人抬杠:啊! 那我非得maxPrt(指向最大数的指针)不行么
当然没问题,我们可以选出来两个指针嘛minPtr (指向最小数的指针)和maxPrt(指向最大数的指针)
一个指向最小,一个指向最大;
自己思考一下看能不能想出来?

还记得我最开始给自己这个小任务的时候总觉得逻辑上没错,但是就是各种各样的问题,非常痛苦,当我自己完成了这个代码,通过对数器检测时发现结果是right的时候,心情比较美好,最终要的是强化了自己的自信心,而且会激励自己去勇敢地面对困难
那么闲话少叙,我们上代码
提一嘴:之后对数器的概念我会写一篇,包括怎么用
我也属于复习阶段,也是个小菜鸡,一起进步嘛

package cn.zhen77.sort;

public class selectionSort_plus {
	public static void main(String[] args) {
		DataChecker.check();

		
	}
	static void sort(int[] arr) {
		
		
		for(int i=0;i<=(arr.length)/2;i++) {
			int minPtr = i;
			int maxPtr = arr.length-1-i;
			for(int j=i; j<=arr.length-1-i;j++) {
				minPtr = arr[j]<arr[minPtr] ? j:minPtr;
				
			}
			swap(arr,i,minPtr);
			for(int k=arr.length-1-i;k>=i;k--) {
				maxPtr = arr[k]>arr[maxPtr] ? k:maxPtr;
			}
			swap(arr,arr.length-1-i,maxPtr);
		}
		
	}
	//交换数组中的两个值
		static void swap(int[] arr,int a, int b) {
			int temp = arr[a];
			arr[a] = arr[b];
			arr[b] = temp;
		}
	
}

在这里插入图片描述
不用怀疑正确性,对数器检测的,纯随机,没问题;
以上内容均手打,如有错别字,语句逻辑不通顺请多担待;感谢各位

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值