Die Sortierung der Array-Klasse ist wirklich gut, nicht wahr?
Es wird in aufsteigender Reihenfolge ohne Erlaubnis und sogar in absteigender Reihenfolge sortiert.
Ich hatte jedoch Angst, dass ich stecken bleiben würde, wenn ich die Essenz des Sortierens nicht wüsste. Wie man die Sortiermethode nicht benutzt.
public class Change {
public static void main(String[] args) {
ListManager data = new ListManager();
for (int i = 1; i < 100; i++) {
/*
Die folgenden Werte werden abhängig von dem an signum übergebenen Wert zurückgegeben.
Wenn das Argument größer als Null ist ⇒ 1
Wenn das Argument Null ist ⇒ 0
Wenn das Argument kleiner als Null ist ⇒-1
*/
int num1 = data.compare(i - 1, i);
switch (num1) {
case 1:
//Tauschen
data.exchange(i - 1, i);
//Von hinten ersetzen
for (int n = i; n > 0; n--) {
int num2 = data.compare(n - 1, n);
switch (num2) {
case 1:
data.exchange(n - 1, n);
default:
break;
}
}
default:
break;
}
}
data.checkResult();
}
}
public class ListManager {
private int[] dataList;
private int compareCount;
private int exchangeCount;
public ListManager() {
//Erstellen Sie Daten nach dem Zufallsprinzip
Random random = new Random();
dataList = new int[100];
for (int i = 0; i < dataList.length; i++) {
dataList[i] = random.nextInt(10000);
}
}
/**
*Vergleichen Sie zwei Daten
*
* @param index1
* @param index2
* @return -1:Index1-Daten sind klein, 1:Index2-Daten sind klein, 0:Gleiche Daten
*/
public int compare(int index1, int index2) {
compareCount++;
return (int) Math.signum(dataList[index1] - dataList[index2]);
}
/**
*Tauschen Sie zwei Daten aus
*
* @param index1
* @param index2
*/
public void exchange(int index1, int index2) {
exchangeCount++;
int tmp = dataList[index1];
dataList[index1] = dataList[index2];
dataList[index2] = tmp;
}
/**
*Sortierprüfung
*/
public void checkResult() {
int data = dataList[0];
for (int i = 1; i < dataList.length; i++) {
if (data > dataList[i]) {
throw new RuntimeException("Unsortiert: [" + (i - 1) + "]=" + data + ", [" + i + "]=" + dataList[i]);
}
data = dataList[i];
}
System.out.println("OK sortieren:Vergleich=" + compareCount + ",Tauschen=" + exchangeCount);
}
Ich habe das Gefühl, dass ich nutzlosen Code schreibe, also werde ich ihn reparieren, sobald ich ihn verstehe.
Wenn die Ersetzung beim ersten Switch nicht erfolgt, wird bestätigt, dass der Index in aufsteigender Reihenfolge vor dem Index, den Sie zu diesem Zeitpunkt anzeigen, korrekt angeordnet ist. Bei meinem Code erfolgt die Ersetzung jedoch beim ersten Switch. Ich frage mich, ob es nutzlos ist, weil ich die Reihenfolge vor dem Index überprüfe.
Reicht es aus, die vorherige Bestellung nur zu überprüfen, wenn der Austausch erfolgt?
Ich werde versuchen, es kürzer zu machen.
Recommended Posts