排序算法【选择排序】

选择排序

原理

选择排序是比较排序的一种,它是每次从待排序的数据中找出最小或最大的数据放到前面,直到待排序的数据个数为0,

假设数据5,2,6,5,7,1,8

1、找到最小的1,和第一个位5进行交换

2、在2,6,5,7,5,8中找最小的,2,2在第二位是第二最小,待比较的数据中没有比2小的,不进行交换

3、待比较交换数据6,5,7,5,8中找到最小的,5是第三位最小的,5和6进行交换得到1,2,5,6,7,5,8

4、以此类推最终结果1,2,5,5,6,7,8

时间复杂度:O(n²)

空间复杂度:O(1)

稳定性:不稳定,假如数据5,2,3,5,7,1,8,那么第一个5会和1进行交换,变成在第二个五的后面,所以是不稳定的

示例

import java.util.Random;

/**
 * 选择排序
 *
 **/
public class SelectSortMain {
    public static void main(String[] args) {
        int len = 10;
        int[] datas = new int[len];

        Random r = new Random(0);
        for(int i = 0; i < len;i++) {
            int d = r.nextInt(100);
            datas[i] = d;
        }
        long start = System.currentTimeMillis();
        selectSort(datas);
        long spend = System.currentTimeMillis() - start;
        System.out.println("******  spend " + spend);
        for (int data:
                datas) {
            System.out.print(data + ",");
        }
    }

    public static void selectSort(int[] datas){
        int len = datas.length;
        if(len == 0){
            return;
        }
        //排序趟数
        for (int i = 0; i < len; i++) {
            int minDataIdx = i;
            //寻找最小值
            for (int currIdx = i+1; currIdx < len; currIdx++){
                //交换
                if(datas[minDataIdx] > datas[currIdx]) {
                    minDataIdx = currIdx;
                }
            }
            if(minDataIdx != i) {
                int tmp = datas[minDataIdx];
                datas[minDataIdx] = datas[i];
                datas[i] = tmp;
            }

        }
    }
}

你可能感兴趣的:(排序算法【选择排序】)