Cara berpikir alternatif tentang ini adalah apa nilai maksimum i
menjadi sebelum diatur ulang. Ini, ternyata, membuatnya lebih mudah untuk alasan tentang bagaimana urutan urutan sebelumnya A
mempengaruhi waktu menjalankan algoritma.
Secara khusus, perhatikan bahwa ketika i
menetapkan nilai maksimal barunya, sebut saja N, array [A[0], ..., A[N-1]]
diurutkan dalam urutan menaik.
Jadi apa yang terjadi ketika kita menambahkan elemen A[N]
ke dalam campuran?
Matematika:
Baiklah, katakan saja itu pas di posisi . Kemudian kita membutuhkan iterasi loop (yang akan saya nyatakan ) untuk memindahkannya ke tempat iterasi , untuk memindahkannya ke tempat , dan secara umum:pNNstepsN−1N+(N−1)N−2
stepsN(pN)=N+(N−1)+(N−2)+⋯+(pN+1)=12(N(N+1)−pN(pN+1))
Untuk array yang diurutkan secara acak, mengambil distribusi seragam pada untuk setiap , dengan:pN{0,1,…,N}N
E(stepsN(pN))=∑a=1NP(pN=a)stepsN(a)=∑a=1N1N12(N(N+1)−a(a+1))=12(N(N+1)−13(N+1)(N+2))=13(N2−1)=Θ(N2)
jumlahnya dapat ditampilkan menggunakan rumus Faulhaber atau tautan Wolfram Alpha di bagian bawah.
Untuk array yang diurutkan terbalik, untuk semua , dan kami mendapatkan:pN=0N
stepsN(pN)=12N(N+1)
tepatnya, mengambil lebih lama dari nilai .pN
Untuk larik yang sudah disortir, dan , dengan istilah tingkat rendah menjadi relevan.pN=NstepsN(pN)=0
Total waktu:
Untuk mendapatkan total waktu, kami meringkas langkah-langkah di atas semua . (Jika kami sangat berhati-hati, kami akan menjumlahkan swap serta iterasi loop, dan menjaga kondisi awal dan akhir, tetapi cukup mudah untuk melihat mereka tidak berkontribusi pada kompleksitas dalam kebanyakan kasus) .N
Dan lagi, menggunakan linearitas harapan dan Formula Faulhaber's:
Expected Total Steps=E(∑N=1nstepsN(pN))=∑N=1nE(stepsN(pN))=Θ(n3)
Tentu saja, jika karena alasan tertentu bukan (mis. Distribusi array yang kita lihat sudah sangat dekat untuk disortir), maka ini tidak selalu perlu menjadi kasus. Tetapi dibutuhkan distribusi yang sangat spesifik pada untuk mencapai ini!stepsN(pN)Θ(N2)pN
Bacaan yang relevan: