快速排序的思路:选一个基准值 current,把比它大的放在它右边,比它小的放在它左边,递归直到排序完成。
用一个10个数字的数组,解释一下快速排序的过程:
第一趟:
原始数组:[4, 47, 26, 1, 23, 74, 87, 91, 49, 43]
从右向左找小数:[4, 47, 26, 1, 23, 74, 87, 91, 49, 43]
从左向右找小数:[4, 47, 26, 1, 23, 74, 87, 91, 49, 43]
初次交换:[4, 1, 26, 47, 23, 74, 87, 91, 49, 43]
继续向中间查找:[4, 1, 26, 47, 23, 74, 87, 91, 49, 43]
两队人马相遇,和基数做交换:[1, 4, 26, 47, 23, 74, 87, 91, 49, 43]
第二趟:
分成两拨:[1],[4],[26, 47, 23, 74, 87, 91, 49, 43]
对右侧数组进行一波操作:[26, 47, 23, 74, 87, 91, 49, 43]
从右向左找小数:[26, 47, 23, 74, 87, 91, 49, 43]
从左向右找大数:[26, 47, 23, 74, 87, 91, 49, 43]
初次交换:[26, 23, 47, 74, 87, 91, 49, 43]
继续向中间查找:[26, 23, 47, 74, 87, 91, 49, 43]
两队人马相遇,和基数做交换:[23, 26, 47, 74, 87, 91, 49, 43]
以这种形式递归,直到完成整个排序。
将上述过程翻译成代码:
//把交换两个元素的方法提取出来 function swap(arr,i,j){ var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } //排序方法 function quickSort(arr,left,right){ if (left < right){ var i = left+1; var j = right; var x = arr[left]; while (i < j){ //从右向左找比x小的数 while(i<j && arr[j]>=x){ j--; } //从左向右找比x大的数 while(i<j && arr[i]<x){ i++; } //交换前面找到的两个数 if(i < j){ swap(arr,i,j); } } //左右下标相遇,将相遇处的数和基数值交换 swap(arr,i,left); //基数值此时的下标为i,以i为分界将数组分成两部分,继续递归调用 quickSort(arr, left, i - 1); quickSort(arr, i + 1, right); } } //调用方法 var array10=[]; for(var i=0;i<10;i++){ array10[i] = Math.floor(Math.random()*100); } quickSort(array10,0,9);