排序算法--选择排序

选择排序也是一个很简单的排序算法,我来备忘一下。。

原理:我们仍旧选择排序一个整数组成的数组,升序排列。每次遍历数组中还没有排好序的部分,在其中选择一个最小的,放到最左边的位置,等整个数组中的元素全部放到该放的位置即停止。

步骤:初始化遍历计数i和j,i代表每次遍历要放到最终位置的元素的下标,当然了,也代表着遍历第几次数。j就用来遍历还没有放好的部分,从中去选择一个最小的元素。需要注意的是,我们是一个个比较,但是并不是一个个交换,我们弄一个临时变量指向此次遍历中最小的元素,也记录它的值,最后交换i位置的元素和最小元素即可。

分析:先说时间复杂度,比较的次数是n(n-1)/2,交换n次(此处也要说一下,可以遍历n-1次,最后剩下一个元素不再遍历也可以,无关大局,至于交换次数,如果是本来就升序,就不需要交换了),所以时间复杂度就是O(N^2)。关于空间,当然不需要额外的,那就是原地的了。至于稳定性,比如数组[2,2,1],第一次交换会将1和第一个2交换,那么相等元素就被变顺序了,所以它不稳定。

代码展示

public class SelectSort {
	public static void main(String[] args){
		int[] array = {7, 11, 5, 8, 7, 2, 10, 1};
		System.out.print("待排序数组:");//打印排序之前的样子
		for(int k : array)
			System.out.print(k + " ");
		System.out.println();
		sort(array);//排序之中
		System.out.print("排序结果:");//排序之后
		for(int k : array)
			System.out.print(k + " ");
	}
	public static void sort(int[] target){
		if(target==null || target.length<=1)//为空或者个数小于等于1则直接返回
			return;
		int i=0,j=0,minPoint=-1,mininum=Integer.MAX_VALUE;
		for(i=0;i<target.length;i++){
			minPoint = i;//记录此趟遍历的第一个数为最小,标记其下标
			mininum = target[i];//记录这个数
			for(j=i+1;j<target.length;j++){
				if(target[j]<mininum){
					minPoint = j;
					mininum = target[j];
				}
			}
			if(i!=minPoint)
				exchange(target,i,minPoint);
			System.out.print("第"+(i+1)+"趟排序结果:");//每一趟排序后的样子
			for(int k : target)
				System.out.print(k + " ");
			System.out.println();
		}
	}
	public static void exchange(int[] target,int left,int right){
		int tmp =  target[left];
		target[left] = target[right];
		target[right] = tmp;
	}
}

排序结果:

待排序数组:7 11 5 8 7 2 10 1 
第1趟排序结果:1 11 5 8 7 2 10 7 
第2趟排序结果:1 2 5 8 7 11 10 7 
第3趟排序结果:1 2 5 8 7 11 10 7 
第4趟排序结果:1 2 5 7 8 11 10 7 
第5趟排序结果:1 2 5 7 7 11 10 8 
第6趟排序结果:1 2 5 7 7 8 10 11 
第7趟排序结果:1 2 5 7 7 8 10 11 
第8趟排序结果:1 2 5 7 7 8 10 11 
排序结果:1 2 5 7 7 8 10 11 

每一趟遍历都是放好一个最左边的元素,我给排了n次,n-1次也可以的。

最后,本人能力有限,如果有表述不当的地方,欢迎您指正,先在此谢过了~~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值