Recursividad de cambio de ordenación por inserción
o (n ^ 2): Imagine que el ordenamiento por inserción es más o menos similar al burbujeo. Requiere que un elemento se compare con los elementos restantes uno por uno, y se usa un elemento cada vez, lo que equivale a dos bucles for.
publicclassHello{
//插入排序改递归publicstaticvoidff1(int arr[],int k){
if(k==0){
return;}ff1(arr,k-1);//将前k-1个元素进行排序int x = arr[k];int index = k-1;while(x<arr[index]){
arr[index+1]= arr[index];// 比k大的元素应该后移
index--;if(index==-1)break;}
arr[index+1]= x;}publicstaticvoidmain(String[] args){
int arr []={
3,6,2,8,4,9};ff1(arr, arr.length-1);for(int i =0;i<arr.length;i++){
System.out.print(arr[i]);}}}
Torre de Hanoi
O (2 ^ n)
Se encuentra que cada vez que se llama a la función, es el doble que la llamada anterior, que es similar a la secuencia de Fibonacci.
publicclassHello{
//汉诺塔问题publicstaticvoidhanno(int N, String A, String B, String C){
if(N==1){
System.out.println(N+"by"+A+"--->"+B);}else{
hanno(N-1, A, C, B);
System.out.println(N+"by"+A+"--->"+B);hanno(N-1,C, B, A);}}publicstaticvoidmain(String[] args){
hanno(6,"A","B","C");}}
Búsqueda binaria
orden de registro (n)
¿Por qué esta complejidad temporal?
Encuentre la mitad cada vez, entiéndalo como 2 ^ n (el número de veces que busca) = x (el número total de veces), y luego tome el logaritmo, que es el orden log (n)
Los pocos y muchos elementos aquí se definen en función de la agrupación de clasificación Hill, no el número real de elementos.
Si los elementos ordenados son muy malos, es decir, cuando hay pocos elementos, están ordenados, y cuando hay muchos elementos, están desordenados, resultando en
¿Por qué rápido? : Cuando hay pocos elementos, están desordenados, cuando hay muchos elementos, básicamente están en orden.
publicclassHello{
//希尔排序publicstaticint[]ff1(int arr[]){
for(int interval = arr.length/2; interval>0;interval/=2){
//控制每一次的排序量for(int j = interval;j< arr.length; j++){
int num = arr[j];int index = j-interval;while(j>-1&&num<arr[index]){
arr[index+interval]= arr[index];//这就是插入排序, 与之前的插入排序是一样的
index -= interval;if(index<0){
break;}}
arr[index+interval]= num;}}return arr;}publicstaticvoidmain(String[] args){
int array[]={
3,7,2,9,4,1};
array =ff1(array);for(int i =0;i< array.length;i++){
System.out.println(array[i]);}}}
Hill clasifica el estado menos favorito
Esto hace que la complejidad de tiempo de la clasificación de Hill sea O (n ^ 2), porque una gran parte de los elementos deben insertarse más tarde, más los recorridos anteriores, la complejidad de tiempo es O (n ^ 2)
Hill ordena el estado de favorito
Por supuesto, esto representa una parte de la situación, siempre que sea más o menos ordenado, se puede alcanzar este nivel (sustancialmente el orden se refiere al gran número de la derecha, y se supone que cada intercambio es como máximo una vez, es decir , cada vez es O (n ^ 2). El número está determinado por el número de elementos / 2, que es log (n), y la multiplicación de los dos es la complejidad de tiempo mínima.
La segunda parte, complejidad y estabilidad del algoritmo
Tabla de potencia de 2
Cómo evaluar la complejidad del algoritmo
Estabilidad del algoritmo de clasificación
La tercera parte, ejemplo recursivo
Pregunta 1: Xiaobai sube las escaleras (diseño recursivo)
Xiaobai va a subir las escaleras. Las escaleras tienen n escalones. Xiaobai puede subir 1, 2 o 3 escalones a la vez. Se implementa un método para calcular cuántos Xiaobai ha completado las escaleras.
Idea: Imagínese recorriendo el recorrido completo, retrocediendo un paso, un segundo paso y un tercer paso. En estos tres pasos, puede recorrer el recorrido completo en un paso, por lo que obtiene la fórmula de recurrencia: f (n) = f ( n-1) + f (n-2) + f (n-3), aquí se refiere a la suma del número de métodos, es la recursividad del número de métodos (es decir, la forma de caminar por las escaleras) , que es muy similar a la secuencia de Fibonacci, aquí La complejidad del tiempo del algoritmo es O (n ^ 3), y preste atención a controlar la salida, es decir, cuando n = 1, n = 2 y n = 3, deben ser controlado.
el código se muestra a continuación:
import java.util.Scanner;publicclassHello{
//小白上楼梯 : 递归设计publicstaticintff1(int n){
if(n==0)return1;elseif(n==1)return1;elseif(n==2)return2;// 因为可能先走一步,再走一步, 或者直接走两步elsereturnff1(n-1)+ff1(n-2)+ff1(n-3);}publicstaticvoidmain(String[] args){
Scanner sc =newScanner(System.in);while(true){
int num = sc.nextInt();int req =ff1(num);
System.out.println(req);}}}
Pregunta 2: Gire el número más pequeño de la matriz (reforma dicotomía)
Mover los primeros elementos de una matriz hasta el final de la matriz se denomina rotación de la matriz. Ingrese una rotación de una matriz ascendente y emita el elemento más pequeño de la matriz girada.
Idea: Descubrimos que el elemento más pequeño en la matriz rotada es la mitad que está desordenada después de que la matriz se biseca (para ver si está ordenada o desordenada, simplemente compare el tamaño del elemento al principio y al final de la matriz) , y el elemento más pequeño está de nuevo Siempre a la derecha del elemento más grande, es decir, cuando solo quedan dos elementos, el de la derecha es el elemento más pequeño
Tenga en cuenta que este método tiene grandes desventajas, como rotar la prueba de matriz 10111 para obtener la respuesta incorrecta, etc ... emm
el código se muestra a continuación:
import java.util.Scanner;publicclassHello{
//旋转数组的最小元素publicstaticvoidff1(int arr[]){
int begin =0;int end = arr.length -1;//应该没有这种特殊的旋转if(arr[begin]<arr[end]) System.out.println(arr[begin]);;while(true){
int mid =(begin + end)/2;if(arr[begin]<arr[mid]){
//左边有序, 去右边找
begin = mid;}elseif(arr[mid]<arr[end]){
//右边有序, 去左边找
end = mid;}elseif(begin+1==end){
System.out.println(arr[end]);break;}}}publicstaticvoidmain(String[] args){
int arr[]={
2,3,4,0,1};ff1(arr);}}