1. 冒泡排序
思想(从小到大排序):遍历数组,依次比较两个相邻的元素,如果它们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。重复上述操作直至没有相邻元素需要交换,也就是说该元素列已经排序完成。(str.length-1-i为内层循环的临界值(i为外层循环索引))。
/*从大到小排序*/
var str = "1232456789";
function bubbleSort(str) {
var arr = str.split("");
var temp = "";
for (var i = 0; i < arr.length - 1; i++) {
for (var j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] < arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
console.log(arr);
}
bubbleSort(str);
结果:
2. 选择排序
思想:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。(在选择最大/最小值时,用一个变量存储最大/最小值对应的索引。在遍历完一次数组后,再进行赋值(赋值到首部/尾部))
/*从小到大排序*/
function selectionSort(str) {
var arr = str.split("");
for (var i = 0; i < arr.length - 1; i++) {
var min = i;
for (var j = i + 1; j < arr.length; j++) {
if (arr[min] > arr[j]) {
min = j;
}
}
var temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
console.log(arr)
}
selectionSort(str);
结果:
3. 快速排序
思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
function quickSort(arr) {
if (arr.length <= 1) {
return arr;
}
var temp = parseInt(arr.length / 2);
var center = arr[temp];
arr.splice(temp,1);//每个找到数组中的中间索引对应的值。记录并去除
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++) {//对除去中间索引对应的值的数组进行遍历,将大于中间索引对应的值放到left数组中,小于其值的放到right数组中
if (arr[i] > center) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return quickSort(left).concat(center).concat(quickSort(right));
}
console.log(quickSort(str.split("")));