选择排序(Selection Sort)优化

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/u010927640/article/details/53648173


      选择排序(SelectionSort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。它是不稳定的排序方法(比如序列[882]第一次就将第一个[8][2]交换,导致第一个8挪动到第二个8后面)。

      这只是一个toy program,用来说明选择排序优化过程。

      eg:输入一组数据,按照从小到大进行排序。

//选择排序
public class TestNumSort{
	public static void main(String [] args){
		int[] a =new int[args.length];  //定义一个数组,输入多少数组就是多大 
		for(int i=0;i<args.length;i++){
			a[i] = Integer.parseInt(args[i]); //转换成int类型放到数组
		}
		print(a); //调用print方法,把输入的数字输出
		selectSort(a); //调用选择排序方法
		print(a);
	}
	
	//选择排序,未优化(如果是不规则的数比较多,每次遍历可能会进行多次交换)
	private static void selectSort(int[] a){
		for (int i=0;i<a.length;i++){  //数组里的数
			for (int j=i+1;j<a.length;j++){ //把拿到的数a[i]和下一个数a[j]进行比较
				if(a[j] < a[i]){ //如果后面的数a[j]小于拿到的数a[i],则把后面的数调到前面,即交换位置
					int temp = a[i]; //临时变量,先把拿到的数a[i]放到temp中
					a[i] = a[j]; //再把后面的数a[j]放到a[i]中
					a[j] = temp; //最后把temp的值赋给a[j]				
				}				
			}
		}
	}
	
	/* //优化选择排序(每次遍历只会出现一次交换,性能更好)当找到拿到的数与下一个数小的时候,再
	把下一个数直接和后面的数进行比较,如果有更小的,则交换位置
	private static void selectSort(int[] a){
		int k,temp; //在循环之前定义,不用每次循环的时候都要分配栈空间
		for (int i=0; i<a.length; i++){
			k = i; //假设找到当前最小的数,位置为i 
			for(int j=k+1; k<a.length; j++){ //j往后找比i更小的数
				if(a[j] < a[k]){ //如有后面的数有比拿到的数还要小的数
					k = j; //则交换位置
				}
			}
			
			//如果从后面找到的数与当前最小的数不相等,则交换位置
			if(k != i){
				temp = a[i];
				a[i] = a[k];
				a[k] = temp;
			}
		}
	} */
	
	//打印数组
	private static void print(int[] a){
		for(int i=0;i<a.length;i++){
			System.out.print(a[i] + " "); //把输入的数字依次输出
		}
		System.out.println();
	}
}

      运行结果:

              

      优化原理:

      1.减少位置交换次数,未优化之前是每遍历一次就要交换一次位置,这是不必要的

      2.减少栈的使用次数。不用每次循环的时候都要创建一个变量。


猜你喜欢

转载自blog.csdn.net/u010927640/article/details/53648173
今日推荐