原来的数组:9 1 8 6 2 3 5 4 //先用1和1前面的对比,9比1大,所以9向右移动一个位置,给1腾位置
第1次:1 9 8 6 2 3 5 4 //用8与8前面的对比,9比8大,所以9向右移动一个位置,给8腾位置
第2次:1 8 9 6 2 3 5 4 //用6与6前面的对比,8,9比6大,所以8、9向右移动一个位置,给6腾位置
第3次:1 6 8 9 2 3 5 4
第4次:1 2 6 8 9 3 5 4
第5次:1 2 3 6 8 9 5 4
第6次:1 2 3 5 6 8 9 4
第7次:1 2 3 4 5 6 8 9
排序后的数组:1 2 3 4 5 6 8 9
五、基本排序算法的效率比较
function CArray(numElements) { this.dataStore = []; this.pos = 0;//是一个索引值,默认为0,从第一个开始 this.numElements = numElements;//是保存所有的数组元素 this.insert = insert;//向数组中插入一个元素的方法 this.toString = toString;//显示数组中所有元素 this.clear = clear;//清空数组数据 this.setData = setData;//生成了存储在数组中的随机数字 this.swap = swap;//交换数组中两个元素的位置 this.bubbleSort = bubbleSort;//冒泡排序算法 this.selectionSort = selectionSort;//选择排序算法 this.insertionSort = insertionSort;//插入排序算法 /*将传入的数组,存储在datastore中*/ for (var i = 0; i < numElements.length; ++i) { this.dataStore[i] = numElements[i]; } } function setData() { for (var i = 0; i < this.numElements; ++i) { this.dataStore[i] = Math.floor(Math.random() * (this.numElements+1)); } } function clear() { for (var i = 0; i < this.dataStore.length; ++i) { this.dataStore[i] = 0; } } function insert(element) { this.dataStore[this.pos++] = element; } function toString() { var retstr = ""; for (var i = 0; i < this.dataStore.length; ++i) { retstr += this.dataStore[i] + " "; if (i > 0 && i % 10 == 0) { retstr += "\n"; } } return retstr; } function swap(arr, index1, index2) { var temp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = temp; } function bubbleSort() { var numElements = this.dataStore.length; for (var outer = numElements; outer >= 2; --outer) { for (var inner = 0; inner <= outer-1; ++inner) { if (this.dataStore[inner] > this.dataStore[inner+1]) { swap(this.dataStore, inner, inner+1); } } // console.log("outer为" + outer + ": " + this.toString()); } } function selectionSort() { var min, temp; for (var outer = 0; outer <= this.dataStore.length-2; ++outer) { min = outer; for (var inner = outer + 1;inner <= this.dataStore.length-1; ++inner) { if (this.dataStore[inner] < this.dataStore[min]) { min = inner; } } swap(this.dataStore, outer, min); // console.log("第"+outer +"次:"+this.toString()); } } function insertionSort() { var temp, inner; //外循环将数组元素挨个移动 for (var outer = 1; outer <= this.dataStore.length-1; ++outer) { temp = this.dataStore[outer];//外循环选中的元素 inner = outer; //内循环则对外循环中选中的元素与它前面的那个元素进行比较。 //如果外循环中选中的元素比内循环中选中的元素小,那么数组元素会向右移动,为外循环中的这个元素腾出位置 while (inner > 0 && (this.dataStore[inner-1] >= temp)) { this.dataStore[inner] = this.dataStore[inner-1]; --inner; } this.dataStore[inner] = temp; // console.log("第"+outer+"次:"+this.toString()); } } /*测试冒泡、选择、插入算法的效率*/ var numElements = 10000; var nums = new CArray(numElements); nums.setData(); var start = new Date().getTime(); nums.bubbleSort(); var stop = new Date().getTime(); var elapsed = stop - start; console.log("用冒泡算法,排序 " + numElements + " 个元素耗时 : " + elapsed + " milliseconds."); start = new Date().getTime(); nums.selectionSort(); stop = new Date().getTime(); elapsed = stop - start; console.log("用选择算法,排序 " + numElements + " 个元素耗时: " + elapsed + " milliseconds."); start = new Date().getTime(); nums.insertionSort(); stop = new Date().getTime(); elapsed = stop - start; console.log("用插入算法,排序 " + numElements + " 个元素耗时: " + elapsed + " milliseconds.");
运行结果:
选择排序和插入排序要比冒泡排序快,插入排序是这三种算法中最快的。