排序算法之选择排序

来源:互联网 发布:去年淘宝双11销售额 编辑:程序博客网 时间:2024/04/29 03:51

定义:

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

原理:

假设给定数组int arr = {数据有n个}。第一趟从arr[0]~arr[n-1]中选取最小值与arr[0]交换;第二趟从arr[1]~arr[n-1]中选取最小值与arr[1]交换;第三趟从arr[2]~arr[n-1]中选取最小值与arr[2]交换;......第i趟从arr[i-1]~arr[n-1]中选取最小值与arr[i-1]交换;第n-1趟从arr[n-2]~arr[n-1]中选取最小值与arr[n-2]交换。总共通过n-1次,得到一个按照从小到大的有序序列。

图解:

这里写图片描述

代码实现:

static void selectSort(int[] arr) {    int temp = 0;    for (int i = 0; i < arr.length - 1; i++) {        int minIndex = i; // 假设最小值的下标索引为 i        for (int j = i + 1; j < arr.length; j++) {            if (arr[minIndex] > arr[j]) { // 证明arr[minIndex]并不是最小值                minIndex = j;            }        }        //在内层循环中,找到最小的数后,再进行交换        if (minIndex != i) {             temp = arr[i];            arr[i] = arr[minIndex];            arr[minIndex] = temp;        }    }}

测试:

public static void main(String[] args) {    int[] arr = { 4,2,-1,8,1};    selectSort(arr);    System.out.println(Arrays.toString(arr));}

结果:

[-1, 1, 2, 4, 8]

算法分析:

选择排序的复杂度分析。第一次内循环比较N-1次,第二次比较N-1次,然后N-3次,N-4次,……..,最后一次是1次。一共比较:(N - 1) + (N - 2) + ... + 1,等差数列求和得:N(N-1)/2次。

由此我们发现不管是怎样的一组数列,比较的次数永远都是N(N-1)/2次,而交换的次数与数列的初始循序就有关了,数列为正序时:交换次数为0。

所以,简单选择排序的时间复杂度为:O(N^2)。

——————————————————————————————————————————————–如果有什么不对的地方,望批评指出。