选择排序的两种算法(Java代码实现)

目录

选择排序:

基本思想:

1:简单选择排序:

基本思想:

过程:

2:堆排序:

基本思想:

过程:


选择排序:

基本思想:

        每一趟从待排序数组中选出最小的数字,按顺序放在已经排好序的数组的后面,直到全部排完。

1:简单选择排序:

基本思想:

        每次选出最小的数,放在已排好数组最后。

过程:

        示意图如下:

选择排序的两种算法(Java代码实现)_第1张图片        

代码实现:

import java.util.Arrays;


public class SimpleSelectSort {
    public static void main(String[] args) {
        int[] a={3,1,1,2,4,4,7};
        SelectSort2(a);
        System.out.println(Arrays.toString(a));
    }
    //不稳定版(常规版本)
    private static void SelectSort(int[] s){
        for(int i=0;i

给出了三个版本,结果算出来都一样。

结果:

时间复杂度:O(n^{2})

空间复杂度:O(1)(常规)

算法特点:

        (1):不稳定排序。(也有稳定版)

        (2):移动次数较少,当每一个数占用空间较多时,比直接插入排序快

2:堆排序:

基本思想:

        利用完全二叉树的顺序存储结构,及完全二叉树中双亲结点和孩子之间的关系,在当前无序数组中选择最大数(或最小数)。(也就是利用大根堆或小根堆)

        每个结点的值都大于其左孩子和右孩子结点的值,称之为大根堆。

        每个结点的值都小于其左孩子和右孩子结点的值,称之为小根堆。       

        父结点索引:(i-1)/2

        左孩子索引:2*i+1

        右孩子索引:2*i+2

过程:

        过程演示连接

代码实现:

import java.util.Arrays;

public class HeapSort {
    public static void main(String[] args) {
        int[] a={3,1,1,2,4,4,7};
        Sort(a);
        System.out.println(Arrays.toString(a));
    }

    private static void Sort(int[] s){
        //第一次将原数组建立成大根堆(每个结点的值都大于其左孩子和右孩子结点的值,称之为大根堆)
        for (int i=(s.length-1-1)/2;i>=0;i--){//父节点为(i-1)/2,i为数组下标
            CreateHeap(s,i,s.length-1);//从下往上构建
        }

        for (int j=s.length-1;j>0;j--){
            //将堆顶[0](也就是最大值)放在[j](也就是数组最后)
            int temp=s[0];
            s[0]=s[j];
            s[j]=temp;
            //将数组下标的0到j-1重新调整为大根堆
            CreateHeap(s,0,j-1);
        }
    }

    private static void CreateHeap(int[] s,int a,int b){
        int temp=s[a];
        //2a+1为左孩子,2a+2为右孩子
        for(int i=2*a+1;i<=b;i=i*2+1){
            if (itemp){//大的孩子如果大于第一个数
                s[a]=s[i];//大孩子上位父节点
                a=i;//将a锁定为大值的下标
            }
            else {//左右孩子都不大于父节点,说明已经成为大根堆,直接跳出循环
                break;
            }
        }
        s[a]=temp;//将第一个数赋给最终的大值的位置
    }

}

结果:

时间复杂度:O(nlog_{2}n)

空间复杂度:O(1)

算法特点:

        (1):不稳定排序。

        (2):数多时可以采用,数少则不宜采用。

        

你可能感兴趣的:(排序算法,java,idea,算法,排序算法,数据结构)