论坛首页 综合技术论坛

自己动手写算法之选择排序

浏览 2799 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-03-30  
选择排序法->选择排序

算法步骤:
1. 未排序序列中找到最小元素,存放到排序序列的起始位置
2. 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾
3. 以此类推,直到所有元素均排序完毕

比较复杂度:n(n-1)/2
交换(赋值)复杂度:n-1
优点:相比冒泡排序来讲,交换的次数减少了
缺点:相对快速排序,比较次数仍然是n²

public static void selectionSort(Integer[] array){
		for(int i=0;i<array.length-1;i++){
			//最小数存放位置
			int minPosition = i;
			for(int j=i+1;j<array.length;j++){
				if(array[j]<array[minPosition]){
					//新的最小数位置
					minPosition = j;
				}
			}
			//找到剩余元素中的最小数,并将其交换至起始位置
			swap(array, i, minPosition);
		}
		
	}

public static void swap(Object[] array,int a,int b){
		Object temp = array[a];
		array[a] = array[b];
		array[b] = temp;
	}
   发表时间:2012-05-29  
交换排名吧?
0 请登录后投票
   发表时间:2012-05-29  
feijing 写道
交换排名吧?

不是交换排序,大多数排序算法中都存在交换操作

这里之所以叫选择排序,是因为每次都是从没有排序的序列中选择最小的元素放在新的位置。交换只是一种手段,
你可以想象从一个未排序的序列A中,每次选择其最小的元素放到新建的序列B(初始为空)中,这样就更好的理解了选择排序。
本例是为了节约空间上的消耗,所以将A空出来地方放新元素。
0 请登录后投票
   发表时间:2012-07-23   最后修改:2012-07-23
你这就是优化了下冒泡排序。
很普遍
public static void maopaoSort(int[] nums){
		for(int i=0;i<nums.length;i++){
			//这里-i ,是因为第一次已经把最大的移动到最后了
			for(int j=0;j<nums.length-i-1;j++){
				int a = nums[j];
				int b = nums[j+1];
				if(a>b){
					nums[j]=b;
					nums[j+1] = a;
				}
			}
		}
	}
	
	public static void maopaoSortTwo(int nums[]){
		for(int i=0;i<nums.length;i++){
			for(int j=0;j<nums.length-1;j++){
				int a = nums[j];
				int b = nums[j+1];
				if(a>b){
					nums[j] = b;
					nums[j+1] = a;
				}
			}
		}
		
		for (int i = 0; i < nums.length; i++) {
			System.out.println(nums[i]);
		}
	}
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics