排序算法-快速排序(javascript)
快速排序
算法思想:在待排序数组中,首先任意选取一个数据作为关键数据(通常取第一个或中间一个),然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。再递归直到结束排序。
从j开始向前搜索(j--),遇到小于key的就将array[j]与array[i]交换;从i往后搜索(i++),遇到大于key的就将array[i]与array[j]交换;再递归。
举个栗子:
将第一个数字作为关键数据 key=6;
6 2 7 3 8 9 此时i=0;j=5;
3 2 7 6 8 9 此时i=0;j=3;
3 2 6 7 8 9 此时i=2;j=3;
3 2 6 7 8 9 此时i=j=2;第一次循环结束
function quickSort(array){ function sort(prev, numsize){ var i = prev; var j = numsize -1; var key = array[prev]; if ((numsize - prev) > 1) { while(i < j){ for(; i < j; j--){ if (array[j] < key) { array[i++] = array[j]; //a[i] = a[j]; i += 1; break; }; } for( ; i < j; i++){ if (array[i] > key){ array[j--] = array[i]; break; } } } array[i] = key; sort(0, i); sort(i + 1, numsize); } } sort(0, array.length); return array; }
另外还有一种简单易懂的方法:
设置两个空数组left和right,将整个数组进行遍历,遇到小于关键数据的就push进left,否则放进right。此处以中间数作为关键数据更好理解。
function quickSort(arr){ if(arr.length <= 1){ return arr; } var pivotIndex = Math.floor(arr.length/2); //取中间的为基准 var pivot = arr.splice(pivotIndex, 1)[0]; //将基准取出并从原数组删除 var left = []; var right = []; for(var i = 0;i < arr.length;i++){ if(arr[i] < pivot){ left.push(arr[i]); }else{ right.push(arr[i]); } } return quickSort(left).concat([pivot],quickSort(right)); }