Aprendizaje del algoritmo 4 (estructura de datos): el principio y el código del algoritmo de clasificación principal (clasificación por selección, clasificación por inserción, clasificación por colinas)
Una breve descripción es: primero busque el elemento más pequeño en la matriz e intercambielo con el primer elemento de la matriz; luego encuentre el elemento más pequeño entre los elementos restantes e intercambie la posición con el segundo elemento de la matriz; y así sucesivamente, hasta que Ordene toda la matriz.
Para una matriz de longitud N, se necesitan aproximadamente (N ^ 2) / 2 comparaciones y N intercambios para seleccionar ordenar
2. Orden de inserción
Orden de inserción, inserte cada elemento en la posición apropiada en otras matrices locales ordenadas, para dejar espacio para el elemento insertado, necesitamos mover los elementos restantes en la posición apropiada en un lugar;
En pocas palabras, primero determine un valor de índice i, a partir de este i, defina j = i, compare a [j] con a [j-1], si a [j-1]> a [j] intercambie los dos , J–, si a [j-1] <a [j], significa que ha alcanzado la posición correcta, salga del bucle pequeño, de lo contrario continúe repitiendo la operación hasta j = 0, después de completar el bucle pequeño, ponga el índice i ++.
3. Tipo de colina
En pocas palabras, primero cambie el intervalo de intercambio de "ordenación por inserción" de 1 a h, y luego h = h / 3 después de que se organice la ronda, y luego repita la operación hasta que h> = 1.
El siguiente es el código
import java.util.*;publicclassExample{
//选择排序publicstaticvoidSelectSort(Comparable[] a){
for(int i =0; i < a.length; i++){
int min = i;for(int j = i+1; j < a.length; j++){
if(less(a[j], a[min])){
min = j;}}exch(a, i, min);}}/*插入排序,简单来说就是先确定一个索引值i,从这个i开始,定义j=i,a[j]与a[j-1]比较,若a[j-1]>a[j]则交换二者,j--,
若a[j-1]<a[j]则表明已经到了正确的位置,退出小循环,否则继续重复操作,直到j=0;完成小循环后把索引i++*/publicstaticvoidInsertSort(Comparable[] a){
for(int i =1; i < a.length; i++){
for(int j = i; j >0&&less(a[j], a[j-1]); j--){
exch(a, j, j-1);}}}//希尔排序publicstaticvoidShellSort(Comparable[] a){
int h =1;while(h < a.length/3){
h =3*h +1;}while(h >=1){
for(int i = h; i < a.length; i++){
for(int j = i; j >= h &&less(a[j], a[j-h]); j-=h){
exch(a, j, j-h);}}
h = h /3;}}//做比较判断,返回bool类型publicstaticbooleanless(Comparable v, Comparable w){
return v.compareTo(w)<0;}//交换数组元素privatestaticvoidexch(Comparable[] a,int i,int j){
Comparable t = a[i];
a[i]= a[j];
a[j]= t;}//打印出数组publicstaticvoidshow(Comparable[] a){
for(int i =0; i < a.length; i++){
System.out.print(a[i]+" ");}
System.out.println();}publicstaticvoidmain(String[] args){
Scanner in =newScanner(System.in);int n = in.nextInt();
Comparable[] arr =newComparable[n];for(int i =0; i < arr.length; i++){
arr[i]= in.nextInt();}SelectSort(arr);InsertSort(arr);ShellSort(arr);show(arr);}}