java_选择排序

来源:互联网 发布:人工智能股票龙头科大 编辑:程序博客网 时间:2024/06/05 15:29

蛮力法之选择排序

选择排序:有n个数的数列,需要对它进行从小到大排列。

 第一次对n个数进行扫描,找到最小的数ai,将ai与a0进行交换,那么n个数里面最小的数排在了第一个,找到了自己的位置。
 
 第二次对n-1个数进行扫描(排除已经找到位置的第一个数),找到最小的数ai,将ai与a1进行交换,那么n-1个数里面最小的数排在了整个数列的第二个,找到了自己的位置。

  ……

 以此类推,就可以将整个数列从小大大进行排序


伪代码:
SelectionSort(A[0...n-1]
 for i <-0 to n-2 do
    min <- i
    for j <-i+1 to n-1 do
        if A[j] <A[min] min <- j
    swap A[i] and A[min]


例子:数列{89,45,68,90,29,34,17}

public class SelectionSort {private int[] numbers = {89,45,68,90,29,34,17};private void sort(){int length = numbers.length;int min = 0;for(int i = 0; i < length-1; i ++){min = i;for(int j = i + 1; j < length; j ++){if(numbers[min] > numbers[j]){min = j;}}swap(i, min);printNumbers(i);}}private void swap(int i, int j){int temp;temp = numbers[i];numbers[i] = numbers[j];numbers[j] = temp;}private void printNumbers(int count){System.out.print(count+" : ");for(int i = 0; i < numbers.length; i++){System.out.print(numbers[i]+"  ");}System.out.println();}public static void main(String[] args) {(new SelectionSort()).sort();}}
0 : 17  45  68  90  29  34  89  
1 : 17  29  68  90  45  34  89  
2 : 17  29  34  90  45  68  89  
3 : 17  29  34  45  90  68  89  
4 : 17  29  34  45  68  90  89  
5 : 17  29  34  45  68  89  90  

算法复杂性:
 
每次扫描:j=i+1 到 j=n-1 ,每次比较  numbers[min] > numbers[j]  为 “1”
那么总的为 比较次数个1的和(n-1)-(i+1)+1=(n-1-i)

扫描了n-1次:求(n-1-i)     i为 0~n-2
(n-1+1)*(n-1)/2=(n-1)*n/2

选择排序的键值交互次数为:n(一遍扫描完了后才需要进行交换)


原创粉丝点击