排序算法-高级排序
1.希尔排序
希尔排序是插入排序的升级版本,是将元素按步距分组,在分组内进行插入排序,然后按一定规律缩小步距,步距为1时进行最后一次插入排序。
初始步距是用(nums.length/2)的向下取整。用步距分组排好序后,步距为(原步距/2)的向下取整。步距可以理解为2个元素相隔的距离。
可以将插入排序的代码稍微调整一下。
其中,将插入排序的第二个for循环里面的(i>0)调整成(i>=1),将i--调整成(i=i-1),这样代码的效果是一样的。
修改的1其实就是步距为1,if里面的比较就是比较2个步距为1的元素。(最外层的1是第一个待插入数的索引)
将调整后的插入排序中的1改成意义为步距的变量就是希尔排序的核心代码,此外只需要让步距依次减小直至为1。
修改后希尔排序的代码如下。
快速排序
将第一个数作为锚点,并用一个变量储存起来。左指针(left)停留在数组左边第一个数上,右指针(right)停留在数组右边第一个数上。
如果right指向的值比锚点小,那么将right指向的值赋值给此时左指针指向的值。否则right向左移动。
如果left指向的值比锚点大,那么将left指向的值赋值给此时右指针指向的值。否则left向右移动。
随着right不断向左移动,left不断向右移动,left和right会指向一个地方,此时指针不再移动,并将存储起来的锚点赋值给此时指针指向的值。
这一轮下来让锚点排好了序,用锚点将数组切割成左右两部分,每部分重新进行上面的操作。
var partition=function(left,right){ var pivot = nums[left]; while(left < right){ while(left<right && nums[right] >= pivot) right--;//right向左移动 nums[left] = nums[right]; while(left < right && nums[left]<= pivot) left++;//left向右移动 nums[right] = nums[left]; } nums[left] = pivot; console.log("索引",left,"p",nums[left],"数组",nums); return left; } //排序 var quickSort=function(left,right){ var middle; if(left < right){ middle = partition(left,right);//将锚点排好序 quickSort(left,middle-1);//递归 quickSort(middle+1,right);//递归 } } quickSort(0,nums.length-1);