算法入门学习----1.2选择排序

一、选择排序的原理

 一个数组a[]有N个元素:

   一次从第一个数(arr[0])到最后一个数(arr[n-1])根据遍历,找出最小的数,然后和第一个数(arr[0])交换位置(比较n-1次);

   第二次从第二个数(arr[1])到最后一个数(arr[n-1])根据遍历,找出最小的数,然后和第二个数(arr[1])交换位置比较n-2次);

 第三次从第三个数(arr[2])到最后一个数(arr[n-1])根据遍历,找出最小的数,然后和第三个数(arr[2])交换位置比较n-3次); ........
第N-1次从第N-1个(arr[n-2])数到最后一个数(arr[n-1])根据遍历,找出最小的数,然后和第N-1个数(arr[n-2])交换位置比较1次);

二、选择排序的时间复杂度和空间复杂度

时间复杂度:1+2+3+......(n-1)=n*(n-1)/2    所以时间复杂度为 n^2

空间复杂度:最优的情况下(已经有顺序)复杂度为:O(0) ;

        最差的情况下(全部元素都要重新排序)复杂度为:O(n );;

        平均的时间复杂度:O(1)

稳定性:不稳定,例子中的两个5相对位置会改变。

三、选择排序代码的实现 Java

public class Xuanzhe {
	public static void main(String[] args){  
        int[] arr=new int[]{1,5,6,89,5,6,12,48,4,23};  
        xuanzhedemo(arr);  
    }  
    public static void show(int[] arr){  //输出函数  
        for(int a: arr){  
            System.out.println(a);  
        }  
    }  
    public static void xuanzhedemo(int[] arr){     
        for(int n=1;n<arr.length;n++){            //第一层,表示第几次循环
        	int exchange = n-1;                       //temp表示目前是确定哪个位置的数
            for(int k=exchange;k < arr.length-1;k++){          //第二层,取出每次循环最小那个数的下标,赋值给temp
                if(arr[exchange] > arr[k+1]){  
                	exchange = k+1;
                }  
            }  
            if(exchange!=n-1){                    //如果出现变化,那么更换位置
            	int temp = 0;
            	temp = arr[exchange];
            	arr[exchange]=arr[n-1];
            	arr[n-1]=temp;
            }
        }  
        show(arr);  
    }  
}


四、和冒泡的区别

选择排序比冒泡排序时间上要优秀一点,主要在于,冒泡排序每次比较都需要交换位置,而选择排序通过记录最大或最小位置的索引最后只交换一次位置就可以了。

猜你喜欢

转载自blog.csdn.net/kunfd/article/details/79132468