Algoritme pengurutan kelas kontainer di Java JDK terutama menggunakan pengurutan penyisipan dan pengurutan gabungan. Implementasinya mungkin berbeda di versi yang berbeda. Kode kuncinya adalah sebagai berikut:
// penggabungan
// jika array sudah diurutkan - tidak ada penggabungan
if (((Sebanding<Objek>) di[med - 1]).compareTo(di[med]) <= 0) {
System.arraycopy(masuk, mulai, keluar, mulai, len);
kembali;
}
int r = sedang, i = mulai;
// gunakan penggabungan dengan pencarian eksponensial
Mengerjakan {
Sebanding<Objek> fromVal = (Sebanding<Objek>) di[mulai];
Sebanding<Objek> rVal = (Sebanding<Objek>) di[r];
if (dariVal.compareTo(rVal) <= 0) {
int l_1 = temukan(dalam, rVal, -1, mulai + 1, med - 1);
int toCopy = l_1 - mulai + 1;
System.arraycopy(masuk, mulai, keluar, i, keSalinan);
saya += untuk Menyalin;
keluar[i++] = rVal;
r++;
mulai = l_1 + 1;
} kalau tidak {
int r_1 = temukan(dalam, dariVal, 0, r+1, akhir - 1);
int keSalinan = r_1 - r + 1;
System.arraycopy(masuk, r, keluar, i, keSalinan);
saya += untuk Menyalin;
keluar[i++] = dariVal;
mulai++;
r = r_1 + 1;
}
} while ((akhir - r) > 0 && (med - mulai) > 0);
// salin sisa array
jika ((akhir - r) <= 0) {
System.arraycopy(masuk, mulai, keluar, i, med - mulai);
} kalau tidak {
System.arraycopy(masuk, r, keluar, i, akhir - r);
}
}
Misalnya, {1, 2, 3, 5, 8, 13} diwakili oleh himpunan berikut:
0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
Kode semunya adalah sebagai berikut:
untuk (saya di [0~n-1]) bit[i] = 0;
untuk(saya di [0~n-1])
jika (saya di file masukan)
sedikit[i] = 1
untuk(saya di [0~n-1])
jika(sedikit[i] == 1)
keluaran saya
Cobalah dengan kode java, efisiensinya sangat bagus:
public static void main(String akhir[] args) {
Daftar<Bilangan Bulat> Angkapertama = DaftarArray baru<Bilangan Bulat>();
Daftar<Bilangan Bulat> Angkakedua = DaftarArray baru<Bilangan Bulat>();
untuk (int saya = 1; saya <= 1000000; saya++) {
firstNum.add(i);
angka kedua.tambahkan(i);
}
Koleksi.shuffle(Nomor pertama);
Koleksi.shuffle(Num kedua);
getStartTime();
Koleksi.sort(Nomor pertama);
getEndTime("waktu pengurutan java ");
getStartTime();
Angka Kedua = UniqueSort(Nomor Kedua);
getEndTime("waktu prosesuniqueSort");
}
Daftar statis publik<Bilangan Bulat> Pengurutan unik(Daftar akhir<Bilangan Bulat> Daftar Unik) {
javaUniqueSort.tempList.clear();
untuk (int i = 0; i < javaUniqueSort.temp.length; i++) {
javaUniqueSort.temp[i] = 0;
}
untuk (int i = 0; i < Daftar unik.ukuran(); i++) {
javaUniqueSort.temp[uniqueList.get(i)] = 1;
}
untuk (int i = 0; i < javaUniqueSort.temp.length; i++) {
if (javaUniqueSort.temp[i] == 1) {
javaUniqueSort.tempList.tambahkan(i);
}
}
kembalikan javaUniqueSort.tempList;
}
public static void getStartTime() {
javaShuffle.start = Sistem.nanoTime();
}
public static void getEndTime(String akhir) {
javaShuffle.end = Sistem.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
}
}
Waktu berjalan:
waktu proses pengurutan java: 1257737334ns
waktu proses pengurutan unik: 170228290ns
waktu proses pengurutan java: 1202749828ns
waktu proses pengurutan unik: 169327770ns
public static void main(String akhir[] args) {
Acak acak = baru Acak();
Daftar<Bilangan Bulat> Angkapertama = DaftarArray baru<Bilangan Bulat>();
Daftar<Bilangan Bulat> Angkakedua = DaftarArray baru<Bilangan Bulat>();
untuk (int saya = 1; saya <= 100000; saya++) {
firstNum.add(i);
angka kedua.tambahkan(i);
firstNum.add(random.nextInt(i + 1));
Angka kedua.tambahkan(acak.nextInt(i + 1));
}
Koleksi.shuffle(Nomor pertama);
Koleksi.shuffle(Num kedua);
getStartTime();
Koleksi.sort(Nomor pertama);
getEndTime("waktu pengurutan java ");
getStartTime();
Angka Kedua = UniqueSort(Nomor Kedua);
getEndTime("waktu prosesuniqueSort");
}
Daftar statis publik<Bilangan Bulat> Pengurutan unik(Daftar akhir<Bilangan Bulat> Daftar Unik) {
javaDuplicationSort.tempList.clear();
int[] temp = int baru[200002];
for (int i = 0; i < suhu.panjang; i++) {
suhu[i] = 0;
}
untuk (int i = 0; i < Daftar unik.ukuran(); i++) {
temp[uniqueList.get(i)]++;
}
for (int i = 0; i < suhu.panjang; i++) {
untuk (int j = suhu[i]; j > 0; j--) {
javaDuplicationSort.tempList.add(i);
}
}
kembali javaDuplicationSort.tempList;
}
public static void getStartTime() {
javaShuffle.start = Sistem.nanoTime();
}
public static void getEndTime(String akhir) {
javaShuffle.end = Sistem.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
}
}