以下代码都是JavaScript实现
1.冒泡排序
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
//排序的本质是比较和交换
//-----------冒泡排序-------begin---------//
//写一个冒泡排序函数
function sort(arr){
for(var i = 0; i < arr.length; i++){
for(var j = 0; j < arr.length - 1 - i; j++){
if(compare(arr[j], arr[j + 1])){
exchange(arr, j, j + 1);
}
}
}
}
//写一个比较函数
function compare(a, b){//升序
return (a > b) ? true : false;
}
//写一个交换函数
function exchange(arr, a, b){
var temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
//-----------冒泡排序-------end---------//
//冒泡排序测试
var arr = [5, 4, 3, 2, 1];
sort(arr);
console.log(arr);
</script>
</body>
</html>
2.选择排序
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
//排序的本质是比较和交换
//-----------选择排序-------begin-------//
//写一个选择排序函数
function sort(arr){
//选择排序,内层循环,每次挑出一个最大的值,放到最后面
for(var i = 0; i < arr.length; i++){
var maxIndex = 0;//每次都假设最大值在arr[0]上
for(var j = 0; j < arr.length - i; j++){
if(compare(arr[maxIndex], arr[j])){
maxIndex = j;//替换最大值的索引
}
}
exchange(arr, maxIndex, arr.length - 1 - i);//每圈循环后,把最大值放在最后
}
}
//写一个比较函数
function compare(a, b){//升序
return (a < b) ? true : false;
}
//写一个交换函数
function exchange(arr, a, b){
var temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
//-----------选择排序-------end-------//
//选择排序测试
var arr1 = [5, 4, 3, 2, 1];
sort(arr1);
console.log(arr1);
</script>
</body>
</html>
3.简单的快速排序
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
//排序的本质是比较和交换
//-----容易理解的快速排序-----begin---//
function quickSort(arr){
if(arr == null || arr.length == 0) return [];
//选出排头兵
var header = arr[0];
var left = [];
var right = [];
for(var i = 1; i < arr.length; i++){
if(arr[i] > header){//比排头兵大的放右边
right.push(arr[i]);
}else{//比排头兵小的放左边
left.push(arr[i]);
}
}
//左边和右边再次快速排序
left = quickSort(left);
right = quickSort(right);
left.push(header);//把排头兵加到左边最后
return left.concat(right);//返回左右分开后的数组
}
//-----容易理解的快速排序-----begin---//
//容易理解的快速排序测试
var arr2 = [9, 3, 5, 6, 2, 1, 7, 8, 0, 4];
console.log(quickSort(arr2));
</script>
</body>
</html>
4.标准的快速排序
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
//排序的本质是比较和交换
//----标准的快速排序--------begin-----//
function standardQuickSort(arr, begin, end){
if(begin >= end) return;//若开始位置大于等于结束位置,直接返回
var left = begin;//左 指向 头
var right = end;//右 指向 尾
do{
do left++; while(left < right && arr[left] < arr[begin])//left右移一位,比较left和right的大小,以及比较arr[left]和arr[begin]的大小
do right--; while(right > left && arr[right] > arr[begin])//right左移一位,比较left和right的大小,以及比较arr[right]和arr[begin]的大小
if(left < right) exchange(arr, left, right);//交换左右的值,说明arr[left]>arr[begin]并且arr[right]<arr[begin];
}while(left < right)//当L < R时,一直执行循环
var swapPoint = left == right ? right - 1 : right;//判断arr[begin]要放在数组的位置
exchange(arr, begin, swapPoint);//交换位置
standardQuickSort(arr, begin, swapPoint);//比arr[begin]小的重新排序
standardQuickSort(arr, swapPoint + 1, end);//比arr[begin]大的重新排序
}
function exchange(arr, a, b){
var temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
//----标准的快速排序--------end-------//
//标准的快速排序测试
var arr3 = [9, 8, 7, 6, 5, 4, 3, 2, 1];
standardQuickSort(arr3, 0, arr3.length);
console.log(arr3);
</script>
</body>
</html>