排序算法-快速排序
1、快排原理:
原理是通过一趟排序,奖数据分成左右两部分,其中一部分比另外一部分的所有数字都要大。
再通过此法将左右两部分再次排序,知道所有的左右两个不可分割为止。
算法步骤:
1)设置两个变量i,j,排序开始的时候:i = 0,j=N-1;
2)以第一个数组元素作为关键数据,复制key,即key = A【0】
3)从j开始向前寻找,即由后向前搜寻(j--),找到第一个小于key的值A【j】,奖A【i】与A【j】互换;
4)从i开始向后手续(i++),找到第一个大于key的A[i],奖A【i】与A[j]互换;
5)重复3和4的步骤,直到 i=j;
3和4步中,没找到符合条件的值,即3中A[j]不小于key,4中A【i】不大于key的时候改变j,i值,使得j=j +1,i = i+1,直到找到为止。
符合条件的值,进行交换的时候i,j指针为止不变。另外,i==j这一过程正好是i+或j-完成的时候,此时循环结束。
2、实现:
1)应用上面原理理论的实现方法
ts代码实现:
export default class SortManager {
/**
* 数组快排1
* @param arr 要排序的数组
* @param left 数组排序的开始位置
* @param right 数组排序的结束位置
*/
static quickSort(arr: number[], left: number, right: number): number[] {
if (left >= right) return arr;
let i = left, j = right, base = arr[left];
while (i != j) {
//顺序很重要,要从右开始找
while (arr[j] >= base && i < j)
j--;
//再找左边的
while (arr[i] <= base && i < j)
i++;
//交换两个数在数组中的位置
if (i < j) {
let t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
//最终基准归位
arr[left] = arr[i];
arr[i] = base;
SortManager.quickSort1(arr, left, i - 1);
SortManager.quickSort1(arr, i + 1, right);
return arr;
}
}
js代码实现:
function quickSort(arr: number[], left: number, right: number): number[] {
if (left >= right) return arr;
let i = left, j = right, base = arr[left];
while (i != j) {
//顺序很重要,要从右开始找
while (arr[j] >= base && i < j)
j--;
//再找左边的
while (arr[i] <= base && i < j)
i++;
//交换两个数在数组中的位置
if (i < j) {
let t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
//最终基准归位
arr[left] = arr[i];
arr[i] = base;
quickSort1(arr, left, i - 1);
quickSort1(arr, i + 1, right);
return arr;
}
2)这种是简单的实现方法,左右排序,然后拼接,这种方法不会改变原数组
Ts代码实现:
export default class SortManager {
/**
* 数组快排1
* @param arr 要排序的数组
*/
static quickSort(arr: number[]): number[] {
if (arr.length <= 1) return arr;
let pivotIndex = Math.floor(arr.length / 2);
let pivot = arr.splice(pivotIndex, 1)[0];
let left = [];
let right = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return SortManager.quickSort(left).concat(pivot, SortManager.quickSort(right));
}
}
js的实现:
function quickSort(arr: number[]): number[] {
if (arr.length <= 1) return arr;
let pivotIndex = Math.floor(arr.length / 2);
let pivot = arr.splice(pivotIndex, 1)[0];
let left = [];
let right = [];
for (let 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));
}