与归并排序一样,快速排序也使用了分治思想。快速排序最坏情况时间复杂度是O(n^2),平均时间复杂度是O(nlgn),而且O(nlgn)中隐含的常数因子很小,快速排序还是原址排序。
实现代码如下:
// var a = [2, 8, 7, 1, 3, 5, 6, 4]; var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; a.sort(function(){return Math.random()>0.5}); console.log(a.join("\t")); quikSort(a, 0, a.length); console.log(a.join("\t")); function quikSort(a, p, r){ if(p < r - 1){ var q = partition(a, p, r); quikSort(a, p, q); quikSort(a, q + 1, r); } } function partition(a, p ,r){ var x = a[r - 1]; var i = p - 1; for(var j = p; j < r - 1; j++){ if(a[j] <= x){ i = i + 1; exchange(a, i, j); } } exchange(a, i + 1, r - 1); return i + 1; } function exchange(a,i,largest){ var temp = a[i]; a[i] = a[largest]; a[largest] = temp; }
随机化快速排序:
// var a = [2, 8, 7, 1, 3, 5, 6, 4]; var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; a.sort(function(){return Math.random()>0.5}); console.log(a.join("\t")); quikSort(a, 0, a.length); console.log(a.join("\t")); function quikSort(a, p, r){ if(p < r - 1){ var q = randomPartition(a, p, r);// 快速排序的随机化版本 quikSort(a, p, q); quikSort(a, q + 1, r); } } function randomPartition(a, p ,r){ var i = random(p, r); exchange(a, r, i); return partition(a, p, r); } function random(A, B){ return A + Math.floor((B - A) * Math.random()); } function partition(a, p ,r){ var x = a[r - 1]; var i = p - 1; for(var j = p; j < r - 1; j++){ if(a[j] <= x){ i = i + 1; exchange(a, i, j); } } exchange(a, i + 1, r - 1); return i + 1; } function exchange(a,i,largest){ var temp = a[i]; a[i] = a[largest]; a[largest] = temp; }
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。