js 排序演算法實現
阿新 • • 發佈:2020-12-12
function ArrayList(){ //屬性 this.array=[] //方法 //將資料可以插入到陣列中的方法 ArrayList.prototype.insert=function(item){ this.array.push(item) } //toString ArrayList.prototype.toString=function(){ return this.array.join('-') } //交換兩個位置的資料 ArrayList.prototype.swap=function(m,n){ var temp=this.array[m] this.array[m]=this.array[n] this.array[n]=temp } //實現排序演算法 //氣泡排序 ArrayList.prototype.bubbleSort=function(){ //1.獲取陣列的長度 var length=this.array.length //第一次比較,i=0 比較0 和 1位置的兩個資料,如果0位置大於 1位置的資料 //最後一次進來 i=length-2,比較 length-2 和 length-1 的兩個資料 for(var j=length-1;j>=0;j--){ for(var i=0;i<j;i++){ if(this.array[i]>this.array[i+1]){ //交換兩個資料 this.swap(i,i+1) } } } } //選擇排序 ArrayList.prototype.selectionSort=function(){ //1.獲取陣列的長度 var length=this.array.length //2.外層迴圈:從 0 位置開始取資料 var min=0 for(var j=0;j<length-1;j++){ //記憶體迴圈:從 i+1位置開始,和後面的資料進行比較 var min=j for(var i=min+1;i<length;i++){ if(this.array[min]>this.array[i]){ min=i } } this.swap(min,j) } } //插入排序 ArrayList.prototype.insertionSort=function(){ //1.獲取陣列的長度 var length=this.array.length //2.外層迴圈:從第1個位置開始獲取資料,向前面區域性有序進行插入 for(var i=1;i<length;i++){ //3.內層迴圈:獲取 i位置的元素,和前面的資料依次進行比較 var temp=this.array[i] var j=i while(this.array[j-1]>temp&&j>0){ this.array[j]=this.array[j-1] j-- } //4.將 j位置的資料,放置 temp就可以啦 this.array[j]=temp } } //希爾排序 ArrayList.prototype.shellSort=function(){ //1.獲取陣列的長度 var length=this.array.length //2.初始化的增量 var gap=Math.floor(length /2) //3.while 迴圈(gap不斷的較小) while(gap>=1){ //4.以 gap 作為間隔,進行分組,對分組進行插入排序 for(var i=gap;i<length;i++){ var temp=this.array[i] var j=i while(this.array[j-gap]>temp&&j>gap-1){ this.array[j]=this.array[j-gap] j-=gap } //5.將 j 位置的元素賦值 temp this.array[j]=temp } //6.增量變化 /2 gap=Math.floor(gap/2) } } //快速排序 //1.選擇樞紐 ArrayList.prototype.medium = function (left,right) { // 1. 取出中間的位置 var center = Math.floor((left + right)/2); // 2. 判斷大小,並且進行交換 if ( this.array[left] > this.array[center]){ this.swap(left , center); }; if (this.array[left] > this.array[right]){ this.swap(left , right); }; if (this.array[center] > this.array[right]){ this.swap(center , right); }; // 3.將center換到right-1的位置 this.swap(center , right - 1) return this.array[right - 1] }; // 2. 快速排序的實現 ArrayList.prototype.quickSort = function () { this.quick(0 , this.array.length - 1); }; ArrayList.prototype.quick= function (left , right) { // 1. 結束條件 if ( left >= right ){ return }; // 2. 獲取樞紐 var pivot = this.medium(left , right); // 3. 定義變數,用於當前找到的位置 var i = left; var j = right - 1; // 4. 開始進行交換 while (i<j){ while(this.array[++i] < pivot){}; while (this.array[--j] > pivot){}; if (i < j){ this.swap(i , j); }else{ break; }; } // 5. 將樞紐放置在正確的位置,i的位置 this.swap(i ,right-1); // 6. 分而治之 this.quick(left, i-1); this.quick(i + 1, right); }; } //測試類 var list=new ArrayList() list.insert(66) list.insert(88) list.insert(12) list.insert(87) list.insert(100) list.insert(5) list.insert(566) list.insert(23) alert(list) //驗證氣泡排序 list.bubbleSort() alert(list) //2.驗證選擇排序 list.selectionSort() alert(list) list.insertionSort() alert(list) //驗證希爾排序 list.shellSort() alert(list) //驗證快速排序 list.quickSort() alert(list)