Ordenar: "rápida tipo" debe entenderse tan rápidamente

Comprender ordenación rápida

ordenación rápida (ordenación rápida) es una especie de burbuja Un mejorado.

ordenación rápida es propuesto por CARHoare en 1960. La idea básica es:
      al ordenar los datos del viaje a clasificar en dos porciones separadas, una porción de todos los datos que la otra porción de todos los datos a ser pequeñas, entonces el método de acuerdo con ordenar rápidamente las dos porciones respectivamente, todo el proceso utilizando un recursiva, con el fin de llegar a una secuencia ordenada.


Hacemos necesidad de prestar atención al punto clave: Repetir región y la división celular

ordenación rápida de pensar, vamos a entender lo que es una simple simulación:

arr: 2 5 1 4 9
选择一个划分大小区的中间标志位值:4
划分后的arr:2 1 4 5 9  大区为:5 9  小区为:2 1
对大区进行选择标志位并划分大小区:5 9 标志位为 5          小区为: null   大区为: 9
对大区进行选择标志位并划分大小区:1 2 标志位为 2          小区为: 1      大区为:null
直到各区再次划分时 区域元素个数小于 2 为止结束。
不断划分区域后的最终 arr:1 2 4 5 9

ordenación rápida de entendimiento viene en la siguiente tabla:
Aquí Insertar imagen Descripción

Lograr la operación de división repita el tamaño de la zona es la más crítica:
Aquí les presento nuestra idea: Fijamos la secuencia requerida para realizar el tamaño de la zona para devolver la bandera valor subíndice entre los cuales, después de nuevo de forma recursiva antes de que el subíndice del distrito y el subíndice región de tamaño dividida de la zona, esta zona sigue dividiendo el número de elementos es menor del 2 hasta el final del proceso de división, y en última instancia al final de la recursividad, se realiza nuestra ordenación rápida.

Nombre de la función y la lista de parámetros detalles:

using sz=vector<int>::size_type ;
int myParition(vector<int>& ivec,sz start,sz end){ 
}

Nos dimos cuenta de forma rápida cómo la idea de dividir el tamaño de la zona:

Bandera que toma el último valor de elemento no es la secuencia de clasificación.

ángulo doble método estándar : Punto de posición de inicio de la secuencia de izquierda, que apunta a la última posición de la derecha de la secuencia
de la esquina marcada reglas de modificación : Punto de izquierda a elementos de la misma, se ha incrementado a una posición superior a la bandera posición, seguido de punto correcto a los elementos ha ido disminuyendo
a menos de la bandera posición del elemento, después de intercambiar elementos.
condición final : a la izquierda y el punto justo en el mismo punto.
El paso final : elementos de conmutación y las banderas de la izquierda y el elemento derecho también punto, porque los elementos derecho e izquierdo también debe punto mayor que o igual a banderas, puede ser intercambiado para dar una posición bit final de la bandera, y devuelve la posición valor.
Precauciones : posición del punto de izquierda siempre debe ser inferior a los puntos necesarios en el lugar.

using sz=vector<int>::size_type ;
int myParition(vector<int>& ivec,sz start,sz end){   //分治函数,比基点大的元素均在右边,小的在左边
        if(end>=ivec.size()){
            cerr<<"Invalid parameters!"<<endl;
            throw new exception();
        }
        int &keyVal = ivec.at(end);        //引用标志位
        while(start < end){
           //递推 start直到大于标志位的值出现
            while (start < end && ivec.at(start)<= keyVal)  ++start;  
           //递减end直到小于标志位的值出现
            while (start < end && ivec.at(end) >= keyVal)   --end;     
            if(start!=end)
                swap(ivec.at(start),ivec.at(end));
        }
        swap(keyVal,ivec.at(start)); //将标志位移动到分区点位置
        return start;
}



Para código de barras empezar rápidamente

Caso de prueba:

  • Prueba de funcionamiento: {9,3,4,5,6,2,1}
  • Prueba de valor límite: {1}, {2,1}
  • valores de las pruebas de repetición: {} 1,1,2,3,1,3,1,9,9,7,6,6
  • Prueba de rendimiento: {entrada, miles de ensayo, prueba de presión}
using sz=vector<int>::size_type ;
int myParition(vector<int>& ivec,sz start,sz end){   //分治函数,比基点大的元素均在右边,小的在左边
        if(end>=ivec.size()){
            cerr<<"Invalid parameters!"<<endl;
            throw new exception();
        }
        int &keyVal = ivec.at(end);
        while(start < end){
            while (start < end && ivec.at(start)<= keyVal)  ++start;
            while (start < end && ivec.at(end) >= keyVal)   --end;
            if(start!=end)
                swap(ivec.at(start),ivec.at(end));
        }
        swap(keyVal,ivec.at(start));
        return start;
}
/*
 * end 为最后一个元素角标
 */
void myQuickSort(vector<int>& ivec,sz start,sz end){  //快速排序
    if(ivec.size()<2 || start>=end) return;   //考虑好输入的错误问题
    int index = myParition(ivec,start,end);
    if(start<index)
        myQuickSort(ivec,start,index-1);
    if(end > index)
        myQuickSort(ivec,index+1,end);
}
Publicado 42 artículos originales · ganado elogios 25 · vistas 3243

Supongo que te gusta

Origin blog.csdn.net/chongzi_daima/article/details/105091026
Recomendado
Clasificación