时间复杂度为O(N*logN)的三个算法,归并排序、快速排序、堆排序、希尔排序
归并排序:
将数组分为若干个步长为1的区间,把两个相邻的区间合并,成为一个步长为2的有序区间 ,然后把两个相邻的步长为2的区间合并,成为一个步长为4的有序区间,以此类推,直到最后所有都有序
新建一个数组,将需要合并的区间A、区间B从第一个开始比较,如果A中当前指向的数和B指向的比较,更小,在新建的数组放入A中指向的数,A中的指针向前移一位,数组中指针向前移一位。若B中指向的数小,同理。直到A或B的全部数都放进新建数组中,将另一个数组剩下的值接在后面。新数组为合并后的新的有序区间。递归调用分解方法,分解后调用合并方法。
快速排序:
将数组最左、中间、最右的数大小排序,最小的放在最左,第二大的放在中间,最大的放在最右
将中间的数放在数组倒数第二个位置,以这个数作为标准排序。设置指针i、j,判断 i 指向的数是否比倒数第二个数大,不是则 i 向右移动一位 ,直到找到比倒数第二个数大或者 i == j 时;i 停下后,判断 j 指向的数是否比倒数第二个数小,如果是则和 i 指向的数交换,否则向左移动一位继续寻找,找到则交换。i 最终停下的位置和倒数第二个数交换。此时数组分为比排序标准的数小和比排序标准数大两部分。在这两部分中再分别进行刚才的快速排序。