排序算法——选择排序(Selection Sort)

来源:互联网 发布:软件风险管理报告 编辑:程序博客网 时间:2024/06/16 13:25

排序算法——选择排序(Selection Sort)


算法简介(Introduction)
We start selection sort by scanning entire given list to find its smallest element and exchange it with the first element, putting the smallest element in its final position in sorted list. Then we can scan the list, starting with the second element to find the smallest element among the last n-1 elements and exchange it with the second element, putting the second smallest element in its final position. Basically, in the ith scanning among last n-1-i elements, find the smallest one and exchange with ith element in the list.
这里写图片描述
Left elements has been sorted. Exchange A[i] with A[min].

伪代码(Pseudocode)

function 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] then                min ⟵ j        swap A[i] and A[min]

基本属性(property)
Input: an array A[0..n-1] of n order able items, such as numbers, characters, character strings etc.

Output: an array A[0..n-1] sorted in non-descending order.

In-place: YES. Only requires a constant amount O(1) of additional memory space. Just a little memory for variable i, j, min, tmp(for swap).

Stable: YES. Does not change the relative order of elements with equal keys. For example, A[3]=A[15]=100. The relative order of A[3] and A[15] does not change, which is A[3] is always on the left of A[15].

时间复杂度(Time Complexity)
The size of input is n.
The basic operation is key comparison A[j] < A[min].
The number of times basic operation performed id denoted as Cn.
这里写图片描述
Hence, selection sort is quadratic time.

适用情形(Suitable Situation)
Selection sort performs inefficiently on large list compared with insertion sort due to its O(n^2) time complexity. But it is noted for its simplicity. It is a well-known brute force algorithm.

Java Code

public class Sort{    //Selection sort method    public static int[] selectionSort(int[] A){        int i,j,min,tmp;        for(i=0;i<A.length-1;i++){            min=i;            for(j=i+1;j<A.length;j++)                if(A[j]<A[min])                    min=j;            tmp=A[i];            A[i]=A[min];            A[min]=tmp;        }        return A;    }    //Test    public static void main(String[] args){        int[] A={10,15,32,87,90,100,52,67};        int[] sortedA=Sort.selectionSort(A);        for(int i=0;i<sortedA.length;i++)        System.out.print(sortedA[i]+" ");    }}

运行结果(Result)

10 15 32 52 67 87 90 100 

写在最后的话(PS)
If you have any question for me, please contact me. My email address is shuaiw6@student.unimelb.edu.au.

原创粉丝点击