1.冒泡排序
O(n^2)
相邻的两个做比较,两个for循环,第一个for循环代表一共需要排几轮,第二个for循环代表每轮需要排几个数(因为每排一次就有一个数被确定)
下面是从小到大排序
function sort(arr: number[]) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length-1-i; j++) {
if (arr[j] > arr[j + 1]) {
let temp = arr[j + 1]
arr[j + 1] = arr[j]
arr[j] = temp
}
}
}
return arr
}
console.log(sort([6, 7, 8, 11,1, 67, 54, 5, 68]))
2.快速排序
0(nlogn)
选择一个数,比此数大的放在右边,比此数小的放左边。我选择的数是每次数组的第一个值。现在有两个指针,左和右,每次拿数组的第一个数save作为比较的值,首先是R指向的数与save比较,如果大于save就不移动,R就向左移动一个位置,如果小于save,就移动到L位置,将值赋值给L,然后L指针向右移动一位,再用L指针的数与save比较,save大于L指向的数,就把这个数放在右边即R指向的位置,如果save小于L指向的数,就不移动,指针L向右移动一位。当L=R代表移动完成,将save放在此时指向的位置。然后save左右两边的序列,再次进行以上的排序方法,直到左边或右边的数只有一个,就说明当前左边或右边是有序的。
function test(arr, L, R) {
let a = L
let b = R
let save = arr[L]
let flag = 1 //用来标识当前是比较比较L还是比较R
while (L !== R) {
if (flag === 1) {
if (arr[R] < save) {
arr[L] = arr[R]
L++
flag = 2
}
else {
R--
}
} else {
if (arr[L] > save) {
arr[R] = arr[L]
R--
flag = 1
} else {
L++
}
}
}
arr[L] = save
if (L - a > 1) {
test(arr, a, L)
}
if (b - L > 1) {
test(arr, L + 1, b)
}
return arr
}
let a = [6, 7, 8, 3, 111, 67, 54, 5, 68]
let len = a.length
console.log(test(a, 0, len - 1))