Javaの基本-選択ソート(選択ソート、ヒープソート)

1.並べ替えを選択します

  • 原則:順序付けされていない間隔から最大(または最小)の要素が選択されるたびに、並べ替えられるすべてのデータ要素が配置されるまで、順序付けられていない間隔の最後(または最前面)に格納されます。

  • 安定性(不安定)
    1。安定したシーケンスは不安定なシーケンスになる可能性があります;
    2。安定したシーケンスは安定することができません;

  • スペースの複雑さ:O(1)

  • 時間計算量:O(O(n ^ 2))

public static void selectsort(int[] arr){
    
    
        for (int i =0;i < arr.length;i++){
    
    
            for (int j = i+1;j < arr.length;j++){
    
    
                if(arr[i] > arr[j]){
    
    
                    int tmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = tmp;
                }
            }
        }
    }

2.ヒープソート

  • 安定性(不安定)
    1。安定したシーケンスは不安定なシーケンスになる可能性があります;
    2。安定したシーケンスは安定することができません;

  • スペースの複雑さ:O(1)

  • 時間計算量:O(n * logn)

public static void heapsort(int[] arr){
    
    
        //首先将数组元素放入一个堆
        createheap(arr);

        int end = arr.length-1;//因为后面要将堆头和最后一个元素交换位置
        while(end > 0){
    
    
            int tmp = arr[0];
            arr[0] = arr[end];
            arr[end] = tmp;
            adjustDown(arr,0,end);//调用向下调整方法重新构造大根堆
            end--;//构造完之后,将最后一个元素去掉
        }
    }
    //构造一个堆
    public static void createheap(int[] arr){
    
    
        for(int i =(arr.length-1-1)/2;i >= 0;i--){
    
    
            adjustDown(arr,i,arr.length);
        }
    }
    //向下调整方法
    public static void adjustDown(int[] arr,int parent,int len){
    
    
        //计算左孩子节点下标
        int child = 2*parent+1;
        while(child < len){
    
    
            //左右孩子选择最大的
            if(child+1 < len && arr[child] < arr[child+1]){
    
    
                child++;
            }
            //到了这一步,已经找到最大的孩子,和双亲进行比较
            if (arr[child] > arr[parent]){
    
    
                int tmp = arr[child];
                arr[child] = arr[parent];
                arr[parent] = tmp;
                parent = child;
                child = 2*parent+1;
            }else{
    
    
                break;
            }
        }
    }

3.2つのコード結果テスト

public class TestSort {
    
    
//选择排序
public static void selectsort(int[] arr){
    
    
        for (int i =0;i < arr.length;i++){
    
    
            for (int j = i+1;j < arr.length;j++){
    
    
                if(arr[i] > arr[j]){
    
    
                    int tmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = tmp;
                }
            }
        }
    }
//堆排序
public static void heapsort(int[] arr){
    
    
        //首先将数组元素放入一个堆
        createheap(arr);

        int end = arr.length-1;//因为后面要将堆头和最后一个元素交换位置
        while(end > 0){
    
    
            int tmp = arr[0];
            arr[0] = arr[end];
            arr[end] = tmp;
            adjustDown(arr,0,end);//调用向下调整方法重新构造大根堆
            end--;//构造完之后,将最后一个元素去掉
        }
    }
    //构造一个堆
    public static void createheap(int[] arr){
    
    
        for(int i =(arr.length-1-1)/2;i >= 0;i--){
    
    
            adjustDown(arr,i,arr.length);
        }
    }
    //向下调整方法
    public static void adjustDown(int[] arr,int parent,int len){
    
    
        //计算左孩子节点下标
        int child = 2*parent+1;
        while(child < len){
    
    
            //左右孩子选择最大的
            if(child+1 < len && arr[child] < arr[child+1]){
    
    
                child++;
            }
            //到了这一步,已经找到最大的孩子,和双亲进行比较
            if (arr[child] > arr[parent]){
    
    
                int tmp = arr[child];
                arr[child] = arr[parent];
                arr[parent] = tmp;
                parent = child;
                child = 2*parent+1;
            }else{
    
    
                break;
            }
        }
    }

//主函数main用来测试
 public static void main(String[] args) {
    
    
 //选择排序
        int[] arr2 = {
    
    7,4,9,34,0,8,5,22,55,6,12,33,56,89,77};
        selectsort(arr2);
        System.out.print("选择排序结果: ");
        for (int i = 0;i < arr2.length;i++){
    
    
            System.out.print(arr2[i]+" ");
        }
        System.out.println();
       //堆排序
        int[] arr4 = {
    
    7,4,9,34,0,8,5,22,55,6,12,33,56,89,77};
        heapsort(arr4);
        System.out.print("堆排序结果: ");
        for (int i = 0;i < arr4.length;i++){
    
    
            System.out.print(arr4[i]+" ");
        }
        System.out.println();
 }
}

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_45665172/article/details/109648173