Java basics-selection sort (selection sort, heap sort)

1. Select Sort

  • Principle: Every time the largest (or smallest) element is selected from the unordered interval, it is stored at the last (or front) of the unordered interval until all the data elements to be sorted are arranged.

  • Stability (unstable)
    1. A stable sequence can become an unstable sequence;
    2. A stable sequence can not become stable;

  • Space complexity: O(1)

  • Time complexity: 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. Heap sort

  • Stability (unstable)
    1. A stable sequence can become an unstable sequence;
    2. A stable sequence can not become stable;

  • Space complexity: O(1)

  • Time complexity: 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. Two code results test

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();
 }
}

Insert picture description here

Guess you like

Origin blog.csdn.net/qq_45665172/article/details/109648173