桶排序
桶排序只能对正整数进行排序,利用js的数组特性,创建一个新数组作为桶,然后遍历原数组,将值放入对应的桶中,就是将原数组每一项的值作为新数组的索引,该方法为去重排序
function sortT(arr) {
var index = [];
for (let i = 0; i < arr.length; i++) {
if (parseInt(arr[i]) == arr[i]) {
index[arr[i]] = 1
} else {
alert("请输入整数")
}
}
arr = [];
for (var key in index) {
arr.push(key * 1)
}
return arr
}
选择排序
假设一个最小值,然后依次和剩下的数据比较,如果比最小值小记录下最小值和对应的索引,一轮比完后一定能找到一个最小的值,将这个最小值与假设的最小值交换位置,重复这个过程找到第二小的值,以此类推就能的到一个有序的数据。
function sortSelect (arr){
var temp;
for (var i = 0; i < arr.length-1; i++) {
for (var j = i; j < arr.length; j++) {
if(arr[j] <= arr[i]){
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
return arr
}
这里我用了另一种实现方法,不再记录最小值和索引而是直接与假设的最小值交换位置。代码结构就与冒泡排序差不多了。
冒泡排序
经典的排序算法,数据两两比较大的往后移或者往前移,
function sortBubble (arr){
var temp;
for (var i = 0; i < arr.length-1; i++) {
for (var j = 0; j < arr.length -i-1; j++) {
if(arr[j] >= arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr
}
快速排序
- 找出一组数据中间的数据,创建两个新数组,遍历原数组,依次和找到的那个中间值比较,比它小的放在一个数组,比它大的放在一个数组。然后对左边和右边的数组进行同样的操作,最后将这些数组连接起来就能得到一个排好序的数据
function quickSort(arr) {
if (arr.length <= 1) {
return arr
}
var midIndex = parseInt(arr.length / 2);
var mid = arr[midIndex];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++) {
if (i == midIndex) {
continue
}
if (arr[i] < mid) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return quickSort(left).concat([mid], quickSort(right))
}
- 快速排序还有一种实现方法但比第一个更复杂
function quickSort(arr) {
var left = 0; //左边起点
var right = arr.length - 1; //右边起点
quicksort(left, right, arr) //初始调用
function quicksort(left, right, arr) {
if (left > right) { //如果左边起点大于右边起点,递归结束
return;
}
var temp = arr[left], //目标数据
tag,
i = left, //左边节点
j = right; //右边节点
while (i != j) { //循环终结条件
while (arr[j] >= temp && j > i) { //从后往前找到大于目标数据的那一项
j--;
}
while (arr[i] <= temp && j > i) { //从前往后找到小于目标数据的那一项
i++;
}
if (i < j) { //如果i和j没有相遇,交换找到的那两个值
tag = arr[i];
arr[i] = arr[j];
arr[j] = tag;
}
}
arr[left] = arr[i];
arr[i] = temp;
quicksort(left, i - 1, arr);
quicksort(i + 1, right, arr)
}
}