欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《算法图解》-2 选择排序

程序员文章站 2022-07-14 22:17:54
...

一 数组和链表

    作者一计算机的内存为例,介绍常用的数据结构数组跟链表。

计算机内存犹如一大堆抽屉(就是一些存储地址)。

需要存储多个元素时,可使用数组或链表。

数组的元素都在一起,数组索引是从0开始计算的。

链表的元素是分开的,其中每个元素都存储了下一个元素的地址。

数组的读取速度很快。

链表的插入和删除速度很快。

在同一个数组中,所有元素的类型都必须相同(都为intdouble等)。

操作时间如下:

  《算法图解》-2 选择排序

二 选择排序

   《算法图解》-2 选择排序

你要将这个列表按播放次数从多到少的顺序排列,从而将你喜欢的乐队排序。该如何做呢?

遍历是一种办法(不是很快的办法,更好的快速排序在下一章介绍)。

《算法图解》-2 选择排序

作者介绍了这种办法的速度是O(n2).并且解释了为什么忽略1/2的这样的常数。

《算法图解》-2 选择排序

实例代码如下:

《算法图解》-2 选择排序

思路很容易理解,就是找出数组里面最小的数对应的索引,然后弹出来到新数组,重复执行就得到有序的新数据了,很不巧啊,java 数组不支持这种pop操作。换个思路:转成list,遍历list,然后list.remove,在吧list.toarry形成新数组。

还有我找个临时map存放已经排好序的数的位置,遇到就跳过,模拟删除了。

public class SelectSort {
	
	 static Map alreadymap = new HashMap();
	public static int findsmall(int[] nums,Map alreadymap){
		
		int smallest = nums[0];
		int index = 0;
		//找到最小
		for(int i=0; i<= nums.length-1;i++){
			//已排序的过滤掉
			if(alreadymap.containsKey(i)){
				if(smallest == nums[i]){					
					smallest = nums[i+1];
					continue;
				}
				continue;
			}
		
			if(smallest >=nums[i]){
				smallest = nums[i];
				index = i;				
			}			
		}
		alreadymap.put(index, index);
		System.out.println(index+":"+nums[index]);
		return index;
	}
	
	public static int[] selectSort(int [] nums){
		
		int [] res = new int[5];
		
		for(int i=0;i<= nums.length-1;i++ ){
			int smalllest = findsmall(nums,alreadymap);
			res[i] = nums[smalllest];			
		}
		return res;
	}
	

	public static void main(String[] args) {
		int [] test = {5,3,6,2,10};
		int[] res = selectSort(test);
		System.out.println(JSON.toJSON(res));
	}

}

输出:

  3:2
1:3
0:5
2:6
4:10
[2,3,5,6,10]