基本准备:
function CArray(numElems) { this.dataStore = []; this.pos = 0; this.numElems = numElems; this.insert = insert; this.toString = toString; this.clear = clear; this.setData = setData; this.swap =swap; for(var i = 0; i < numElems; ++i) { this.dataStore[i] = i; } } function setData() { for(var i = 0; i < this.numElems; ++i) { this.dataStore[i] = Math.floor(Math.random() * 100);//0-99 } } function clear() { for (var i = 0; i < this.numElems; ++i) { this.dataStore[i] = 0; } } function insert(elem) { this.dataStore[this.pos++] = elem; } function toString() { var str = ""; for(var i = 0; i < this.dataStore.length; ++i) { str += this.dataStore[i] + " "; if( i > 0 && (i+1) %10 === 0) { str += " "; } } return str; } function swap(arr,index1,index2) { var temp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = temp; }
基本排序算法:
- 冒泡排序:最容易实现也是最慢的算法之一
- 从头开始依次分别比较相邻的两个元素并排序,直到最后一个;此时确定最后一个会是最大的;
- 重复上面步骤但不比较已经确定的,此时确定最后第二个是第二大的;
- 继续重复直到剩下第一个元素为止,确定它是最小的;
效果:
function bubbleSort() { var numElems = this.dataStore.length; var temp; for(var outer = numElems; outer > 1 ; --outer) { for(var inner = 0; inner < outer; ++inner) { if(this.dataStore[inner] > this.dataStore[inner + 1]) { swap(this.dataStore,inner,inner + 1); } } } }
- 选择排序:也是简单的算法之一
- 从未排序的数列开头开始向后一个个比较,找到一个比它小的值,交互位置;
- 用刚交互的值从它被替换的位置开始继续向后比较,重复直到比较到最后一个值,此时最前面的值为这次排序找出的最小值,确定它排序;
- 继续从剩下的未确定排序的数列从头开始重复,找到最小值放到前面第二个个位置,重复;
- 继续,直到只剩最后一个数值;
- 效果:
function selectionSort() { var min,temp; for(var outer = 0; outer < this.dataStore.length-1; ++outer) { //不和自己比较减一 min = outer; for(var inner = outer+1; inner < this.dataStore.length; ++inner) { //和已确定排序的个数叫要比较的一个比较 if(this.dataStore[inner] < this.dataStore[min]) { swap(this.dataStore,inner,min); } } } }
- 插入排序:也是简单的算法之一,特别是在对已经排好序的数据操作时效率高;
- 开头的第一个元素为确定排序,从第二个元素开始,在确定的排序数列中从后往前比较;
- 如果大于被比较的数值,则插入其后面,反之则继续往前比较;
- 当第二个元素插入到适当位置后,第三个元素继续重复;
- 继续,直到最后一个元素;
- 效果:
function insertionSort() { var temp,inner; for(var outer = 1; outer < this.dataStore.length; ++outer) { temp = this.dataStore[outer]; inner = outer; while(inner > 0 && (this.dataStore[inner - 1] > temp)) { this.dataStore[inner] = this.dataStore[inner - 1]; //这里不是单纯的交互,不用swap --inner; } this.dataStore[inner] = temp; } }
一般来讲三种算法速度:插入>选择>冒泡;