1.冒泡
for (var i = 0; i < arr.length - 1; i++) {
for (var j = 0; j < arr.length - i - 1; j++) {
if (arr[j + 1] < arr[j]) {
[ arr[j + 1] , arr[j] ] = [ arr[j] , arr[j + 1] ]
}
}
}
2.快速
if (arr.length < 2) {
return arr;
}
var a = Math.floor(arr.length / 2);
var b = arr.splice(a, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] < b) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quick(left).concat(b, quick(right))
}
3.插入排序
function cr(arr) {
for (var i = 1; i < arr.length; i++) {
// 把當(dāng)前要比較的數(shù)儲存起來
var a = arr[i];
for (var j = i - 1; j >= 0 && a < arr[j]; j--) {
arr[j + 1] = arr[j];
}
arr[j + 1] = a;
}
return arr;
}
4.選擇
function select() {
for (var i = 0; i < arr.length - 1; i++) {
var min_index = i;
for (var j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min_index]) {
min_index = j;
}
}
var min = arr[i];
arr[i] = arr[min_index];
arr[min_index] = min;
}
return arr;
}
5.歸并排序
function so(arr) {
if (arr.length < 2) {
return arr;
}
var mid = Math.floor(arr.length / 2);
var left = arr.slice(0, mid);
var right = arr.slice(mid);
return ma(so(left), so(right))
}
function ma(left, right) {
var c = [];
while (left.length > 0 && right.length > 0) {
if (left[0] < right[0]) {
c.push(left.shift());
} else {
c.push(right.shift());
}
}
while (left.length > 0) {
c.push(left.shift());
} while (right.length > 0) {
c.push(right.shift());
}
return c;
}
6.希爾排序
function sell(arr) {
for (var gap = Math.floor(arr.length / 2); gap > 0; gap = Math.floor(gap / 2)) {
var a;
// 數(shù)組遍歷 i從第一個增量開始 從后面的比前面的
for (var i = gap; i < arr.length; i++) {
// 定義一個變量儲存當(dāng)前的這個數(shù)
a = arr[i];
var j = i;
// gap不變 是數(shù)組前半段 a是gap后面的數(shù)
while (j - gap >= 0 && arr[j - gap] > a) {
arr[j] = arr[j - gap];
j = j - gap;
}
arr[j] = a;
}
}
return arr;
}
7.基數(shù)排序
var counter = [];
// maxDigit最大位數(shù)
function sort(arr, maxDigit) {
var mod = 10;
var dev = 1;
for (var i = 0; i < maxDigit; i++, mod *= 10, dev *= 10) {
// 遍歷數(shù)組杯缺,將所有數(shù)放入對應(yīng)桶中
for (var j = 0; j < arr.length; j++) {
// 得到此數(shù)所在的桶
var bucket = parseInt((arr[j] % mod) / dev);
// 當(dāng)此桶為空時
if (counter[bucket] == null) {
// 聲明此桶為二維數(shù)組
counter[bucket] = [];
}
// 將對應(yīng)的數(shù)放入對應(yīng)桶中
counter[bucket].push(arr[j]);
}
var pos = 0;
// 遍歷桶堪簿,將桶中的數(shù)依次放入數(shù)組中
for (var j = 0; j < counter.length; j++) {
var value = null;
// 桶不為空時
if (counter[j] != null) {
// 數(shù)組不為空,刪除數(shù)組首位元素
while ((value = counter[j].shift()) != null) {
// 放入新數(shù)組
arr[pos++] = value;
}
}
}
}
return arr;
}
8.桶排序
function bucketSort(arr, bucketSize) {
if (arr.length === 0) {
return arr;
}
var i;
var minValue = arr[0];
var maxValue = arr[0];
for (i = 1; i < arr.length; i++) {
if (arr[i] < minValue) {
minValue = arr[i]; // 輸入數(shù)據(jù)的最小值
} else if (arr[i] > maxValue) {
maxValue = arr[i]; // 輸入數(shù)據(jù)的最大值
}
}
// 桶的初始化
var DEFAULT_BUCKET_SIZE = 5; // 設(shè)置桶的默認(rèn)數(shù)量為5
bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;
var bucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1;
var buckets = new Array(bucketCount);
for (i = 0; i < buckets.length; i++) {
buckets[i] = [];
}
// 利用映射函數(shù)將數(shù)據(jù)分配到各個桶中
for (i = 0; i < arr.length; i++) {
buckets[Math.floor((arr[i] - minValue) / bucketSize)].push(arr[i]);
}
arr.length = 0;
for (i = 0; i < buckets.length; i++) {
insertionSort(buckets[i]); // 對每個桶進(jìn)行排序看政,這里使用了插入排序
for (var j = 0; j < buckets[i].length; j++) {
arr.push(buckets[i][j]);
}
}
return arr;
}
9.計數(shù)排序
function countingSort(arr, maxValue) {
var bucket =new Array(maxValue + 1),
sortedIndex = 0;
arrLen = arr.length,
bucketLen = maxValue + 1;
for (var i = 0; i < arrLen; i++) {
if (!bucket[arr[i]]) {
bucket[arr[i]] = 0;
}
bucket[arr[i]]++;
}
for (var j = 0; j < bucketLen; j++) {
while(bucket[j] > 0) {
arr[sortedIndex++] = j;
bucket[j]--;
}
}
return arr;
}
10.堆排序
var len; // 因為聲明的多個函數(shù)都需要數(shù)據(jù)長度更米,所以把len設(shè)置成為全局變量
function buildMaxHeap(arr) { // 建立大頂堆
len = arr.length;
for (var i = Math.floor(len / 2)-1; i >= 0; i--) {//以他的父節(jié)點來進(jìn)行判斷
//i ==取出來的父節(jié)點
heapify(arr, i);
console.log(i);
}
}
function heapify(arr, i) { // 堆調(diào)整
var left = 2 * i + 1,//左邊子節(jié)點
right = 2 * i + 2,//右邊子節(jié)點
largest = i;//把i當(dāng)成大頂堆中的父節(jié)點
if (left < len && arr[left] > arr[largest]) {//不存在的節(jié)點排除
largest = left;//如果左邊的子節(jié)點大于他的父節(jié)點 將其位置交換
}
if (right < len && arr[right] > arr[largest]) {
largest = right;//如果右邊的子節(jié)點大于他的父節(jié)點 將其位置交換
}
if (largest != i) {//如果largest不等于i欺栗,說明他不大于他兩個子節(jié)點中得其中一個
swap(arr, i, largest);//將位置交換
heapify(arr, largest);//重新調(diào)用該方法 已達(dá)到維護(hù)完全二叉樹的性質(zhì)
}
}
//交換位置方法
function swap(arr, i, j) {
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
function heapSort(arr) {
buildMaxHeap(arr);//建立新的大頂堆
//因為 排序后 最頂部已經(jīng)是最大的數(shù)
//這里需要將第一位和最后一位的位置更換 將最后一位取出來
//這時候 就需要保證大頂堆的成立 則需要調(diào)用 堆調(diào)整的方法
// arr.length - 1 最后一位 0 為第一位(即最大值或者最小值)
for (var i = arr.length - 1; i > 0; i--) {
swap(arr, 0, i);
len--;//每一次父級-1
heapify(arr, 0);//保證大頂堆的成立
}
return arr;
}