一、排序算法
排序算法有:冒泡排序、选择排序、插入排序、归并排序、计数排序、基数排序、希尔排序、堆排序、桶排序。
二、冒泡算法
function ArrayList() {
var arr = [];
// 数组中插入数据
this.insert = function(num) {
return arr.push(num);
}
// 打印arr
this.print = function() {
console.log(arr);
}
// 互换位置
function swap(num1, num2) {
var temp = arr[num1];
arr[num1] = arr[num2];
arr[num2] = temp;
}
// 冒泡排序
this.bubbleSort = function() {
for(var j = arr.length - 1; j > 0; j --) {
for(var i = 0; i < j; i++) {
if(arr[i] > arr[i + 1]) {
swap(i, i+ 1);
}
console.log('第一个for',arr)
}
console.log('第2个for',arr)
}
}
}
三、选择排序
this.selection = function() {
for (var j = 0; j < arr.length-1; j ++) {
// 最小值的索引
var minIndex = j;
for(var i = j + 1; i < arr.length; i ++ ) {
if(arr[j] > arr[i]) {
minIndex = i;
}
}
swap(minIndex,j);
}
}
四、插入排序
this.insertionSort = function(){
for(var i = 1; i < arr.length; i ++) {
var j = i;
// 把arr[i]拎出来与前面的一个一个比较,大于arr[i]的往后移一步
var temp = arr[i];
while(arr[j-1] > temp && j > 0) {
arr[j] = arr[j-1];
j --;
}
arr[j] = temp;
console.log(arr);
}
}
五、希尔排序
this.shellSort = function() {
// 初始化间隔
var gap = Math.floor(arr.length / 2);
while(gap >= 1) {
// gap作为间隔进行分组,对分组进行插入排序
for(var i = gap; i< arr.length; i ++ ) {
var temp = arr[i];
var j = i;
// 分隔的某一组数进行插入排序
while(arr[j - gap] > temp && j > gap - 1) {
arr[j] = arr[j - gap];
j -= gap;
}
this.arr[j] = temp;
}
// 将gap改为原来的一半,继续循环
gap = Math.floor(gap / 2);
}
}
六、快速排序
// 1.选择枢纽
function median (left, right) {
// 算出中间位置
var center = Math.floor((left + right) / 2);
// 这三个值按从小到大交换位置
if(arr[left] > arr[center]) {
swap(left, center);
}
if(arr[center] > arr[right]) {
swap(center, right);
}
if(arr[left] > arr[right]) {
swap(left, right);
}
if(arr[left] > arr[center]) {
swap(left, center);
}
// 将center换到right-1的位置
swap(center, right - 1);
console.log(arr)
}
// 递归方法
function quick (left, right) {
// 结束条件
if(left >= right) return;
// 获取枢纽
var pivot = median(left, right);
// 设置左右指针
var leftPoint = left;
var rightPoint = right - 1;
// 开始指针查找并交换位置:左指针找到大于枢纽的停下来,右指针找到小于枢纽的停下来
while(true) {
while(arr[++leftPoint] < pivot) {}
while(arr[--rightPoint] > pivot) {}
// 如果左指针大于右指针,则互换位置
if(leftPoint > rightPoint) {
swap(leftPoint, rightPoint);
} else {
break;
}
}
// 将枢纽放置在正确位置,即leftPoint
swap(leftPoint, right - 1);
// 左右两块分别递归调用
quick(left, leftPoint - 1);
quick(leftPoint + 1, right);
}
// 快速排序
this.quickSort = function() {
quick(0, arr.length - 1);
console.log(arr);
}