JS六種排序算法
// 冒泡排序
// 循環的最大值從length遞減
// 基本就是每次循環只能排好最后一個 然后遞減到第一個
function bubbleSort(){
var changedData = new Array();
var index = 0;
console.log("冒泡調用");
for (var j = a.length; j >0 ; j--) {
for (var i = 0; i < j; i++) {
if(a[i]>a[i+1]){
var z = 0;
z = a[i+1];
a[i+1] = a[i];
a[i] = z;
}
changedData[index] = a.toString();
index++;
}//one
}//two
showDateChange(changedData);
}
// 選擇排序
// 外循環 j選取當前元素 到length-1
// 內循環 j+1開始 到length 逐個比較出最小值min
// 交換 min 和 a[j]
function selectionSort(){
var changedData = new Array();
var index = 0;
console.log("選擇調用");
for (var j = 0; j < a.length-1; j++) {
var min = a[j];
var minIndex = j;
for (var i = j+1; i < a.length; i++) {
if(a[i] < min) {
min = a[i];
minIndex = i;
}
}//one
a[minIndex] = a[j];
a[j] = min;
//
changedData[index] = a.toString();
index++;
}//two
showDateChange(changedData);
}
// 插入排序
// 從下標1開始 往后選擇直到最后
// 每個選中的和他前面的所有比較
// 直到找到比他小的 排在他后面
// 相當于從1開始 每次都排好之前的i+1個 直到length
// 和冒泡相反
function insertionSort(){
var changedData = new Array();
var index = 0;
console.log("插入排序");
for (var j = 1; j < a.length; j++) {
var now = a[j];
var i = j - 1;
while(i>=0 && now<a[i]){
// 向后移數組
a[i+1] = a[i];
i--;
}//one
a[i+1] = now;
changedData[index] = a.toString();
index++;
}//two
showDateChange(changedData);
}
// 希爾排序
// 間隔改變的插入排序
// 傳統插入排序 比較前面的相鄰對象
// 希爾排序比較前面的第h個對象 直到h間隔不存在更改
// 改變h 直到 h=1
function shellSort(){
var changedData = new Array();
var index = 0;
console.log("希爾排序");
var N = a.length;
var h = 1;
if (h < N/3) {
h = h*3 + 1;//設置間隔
}
while(h > 0){
for (var j = h; j < a.length; j++) {
for (var i = j;i >= h && a[i] < a[i-h]; i -= h) {
var z;
z = a[i];
a[i] = a[i-h];
a[i-h] = z;
//
changedData[index] = a.toString();
index++;
}
}
h = (h-1)/3;//改變間隔
}
showDateChange(changedData);
}
// 歸并排序
// 數據分為 step為間隔的小數組
// 將小數組排序 step變大 直到為1/2個數組
// 將前后兩個已排序的數組 再排序
function mergeSort(arr){
var changedData = new Array();
console.log("歸并排序");
if (arr.length < 2) {
return;
}
var step = 1;
var left;
var right;
while(step < arr.length){
left = 0;
right = step;
while(right + step <= arr.length){
mergeArrays(arr,left,left+step,right,right+step);
left = right + step;
right = left + step;
}
if (right < arr.length) {
mergeArrays(arr,left,left+step,right,arr.length);
}
step *= 2;
}
function mergeArrays(arr,startLeft,stopLeft,startRight,stopRight){
var leftArray = new Array(stopLeft - startLeft +1);
var rightArray = new Array(stopRight - startRight +1);
k = startRight;
for (var i = 0; i < rightArray.length-1; i++) {
rightArray[i] = arr[k];
k++;
}
k = startLeft;
for (var i = 0; i < leftArray.length-1; i++) {
leftArray[i] = arr[k];
k++;
}
rightArray[rightArray.length-1] = Infinity;
leftArray[leftArray.length-1] = Infinity;
var m = 0;
var n = 0;
for (var k = startLeft; k < stopRight; k++) {
if (leftArray[m] <= rightArray[n]) {
arr[k] = leftArray[m];
m++;
}else{
arr[k] = rightArray[n];
n++;
}
}
arr += "";//轉化為字符串
changedData.push(arr);
}
showDateChange(changedData);
}
// 快速排序
// 沒實現可視化排序
function quickSort(){
console.log("快速排序");
function qSort(list){
if (list.length == 0) {
return list;
}
// 選取基數
var pivotIndex = Math.floor(list.length/2);
var pivot = list.splice(pivotIndex,1)[0];
var left = [];
var right = [];
for (var i = 0; i < list.length; i++) {
if (list[i] > pivot) {
right.push(list[i]);
}else{
left.push(list[i]);
}
}
// 遞歸 更換基數 并且排序其左右
return qSort(left).concat([pivot],qSort(right));
}
a = qSort(a);
showDate();
}
來自:https://segmentfault.com/a/1190000007013104
本文由用戶 diamond280 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!