作者:yanyige | 发布时间:2017-03-15 22:25
排序算法总结
四、快速排序
快速排序在各个面试中经常容易考到,基本思想是通过一趟排序之后,数组的一部分总是必另一部分小。然后对两部分分别进行快速排序,整个过程可以递归进行。
具体来说就是在待排序的数组中取一个参考值(通常是第一个数值),将数组分成两部分,比参考值小的数值在数组的前半部分,比参考值大的数值在数组的后半部分。并且把该参考值放在中间。递归进行此部分直到整个数组排序为止。
时间复杂度: O(n^2)
具体代码如下:
function fastSort(arr, begin, end) {
let i = begin;
let j = end;
if(begin < end) {
let temp = arr[begin];
while(i != j) {
while(j > i && arr[j] > temp) {
j --;
}
if(j > i) {
arr[i] = arr[j];
i ++;
}
while(i < j && arr[i] < temp) {
i ++;
}
if(i < j) {
arr[j] = arr[i];
j --;
}
}
arr[i] = temp;
fastSort(arr, begin, i - 1);
fastSort(arr, i + 1, end);
}
}
五、归并排序
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个典型应用。将原序列分成若干个子序列,将子序列排序后再合并。这个过程就是归并排序。
时间复杂度: O(n^2)
具体代码如下:
function merge(arr, tempArr, start, middle, end) {
let i = start;
let j = middle + 1;
let k = start;
while(i < middle + 1 && j < end + 1) {
if(arr[i] > arr[j]) {
tempArr[k ++] = arr[j ++];
} else {
tempArr[k ++] = arr[i ++];
}
}
while(i != middle + 1)
tempArr[k ++] = arr[i ++];
while(j != end + 1)
tempArr[k ++] = arr[j ++];
for(i = start; i <= end; i++)
arr[i] = tempArr[i];
}
function mergeSort(arr, tempArr, start, end) {
int mid;
if(start < end) {
mid = (start + end) / 2;
mergeSort(arr, tempArr, start, mid);
mergeSort(arr, tempArr, mid + 1, end);
merge(sourceArr, tempArr, start, mid, end);
}
}