从今天开始每天更新一个算法,包括思想和代码
选择排序 :
时间复杂度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;
}
}
不用怀疑正确性,对数器检测的,纯随机,没问题;
以上内容均手打,如有错别字,语句逻辑不通顺请多担待;感谢各位