Clasificación de selección básica de Java (clasificación de selección, clasificación de pila)

1. Seleccione Ordenar

  • Principio: Cada vez que se selecciona el elemento más grande (o más pequeño) del intervalo desordenado, se almacena al final (o el más importante) del intervalo desordenado hasta que se organizan todos los elementos de datos que se van a ordenar.

  • Estabilidad (inestable)
    1. Una secuencia estable puede convertirse en una secuencia inestable
    2. Una secuencia estable no puede volverse estable;

  • Complejidad espacial: O (1)

  • Complejidad de tiempo: 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. Orden de montón

  • Estabilidad (inestable)
    1. Una secuencia estable puede convertirse en una secuencia inestable
    2. Una secuencia estable no puede volverse estable;

  • Complejidad espacial: O (1)

  • Complejidad de tiempo: 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. Prueba de dos resultados de código

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

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_45665172/article/details/109648173
Recomendado
Clasificación