1. 程式人生 > >js陣列去重與排序

js陣列去重與排序

1.關於陣列去重
// 常見用法:迴圈兩次陣列,第二次迴圈與第一次迴圈的值比較,當兩次迴圈的值相等時,不加入到陣列中,其餘不等新增到新陣列中。
// 程式碼如下;
function delRepeat(arr){ 
 var box = [];//存放去重資料
 for (var i = 0; i < arr.length; i++) {
         //定義一個旗子,檢查是不是有重複的字元
         var flag = true;
         //遍歷存放資料盒子,檢查是否等於當前元素
         for (var j = 0; j < box.length; j++) {
             //如果值存在
             if(box[j]==arr[i]){
                 flag = false;
                 break;//結束for迴圈
             }
         }
         if(flag==false){
             //continue返回執行函式而不壓入陣列
             continue ;
         }
         box.push(arr[i]); 
 }
 return box;
}
arr=[1,2,5,1,1,2];
console.log(delRepeat(arr));
 // 第二種思路利用下標,當新陣列的下標i值不存在時,再新增到新的陣列中。
function delRepeat(arr){
 var array=[];
 for (var i = 0; i < arr.length; i++) {
 if (array.indexOf(arr[i])== -1) {
               array.push(arr[i]);
 }   
 }
 return array;
}
var arr=[1,2,5,2,1,5,5,2,1,1,5,2,2,5,1];
console.log(delRepeat(arr));


// 第三種思路方案
function unique(arr){
 var array=[];
 var json={};
 for (var i = 0; i < arr.length; i++) {
 console.log(json[arr[i]])
 if (!json[arr[i]]) {
               array.push(arr[i]);
               json[arr[i]]=1;
 }   
 }
 return array;
}
var arr=[1,2,5,2,1,5,5,2,1,1,5,2,2,5,1];
console.log(unique(arr));


 //2.二分法查詢時,資料需是排好序的。 基本思想:假設資料是按升序排序的,對於給定值x,從序列的中間位置開始比較,如果當前位置值等於x,則查詢成功;若x小於當前位置值,則在數列的前半段中查詢;若x大於當前位置值則在數列的後半段中繼續查詢,直到找到為止。檢視是否有當前元素
function binarySearch(items, value){ 
 var startIndex = 0, 
stopIndex = items.length - 1, 
middle = Math.floor((stopIndex + startIndex)/2); 
while(items[middle] != value && startIndex < stopIndex){ 
//adjust search area(調整查詢範圍) 
if (value < items[middle]){ 
stopIndex = middle - 1; 
} else if (value > items[middle]){ 
startIndex = middle + 1; 

//recalculate middle(重新計算中項索引) 
middle = Math.floor((stopIndex + startIndex)/2); 

//make sure it's the right value(確保返回正確的值) 
return (items[middle] != value) ? -1 : middle; 



var ar = [1,2,3,4,5,6,7,8,9];  
var value = binarySearch(ar,100);  
console.log(value);  

 //3.氣泡排序就是把大數往數列的後面沉,自然小數就升起來了。首先需要個for迴圈來遍歷陣列,而後每兩個數還需要比較交換,且陣列最後的數不參與比較,因此再有個階梯式for的迴圈。

var a = [3,46,55,2,5,9,8,4,33,7];  
function bubbleSort(arr) {  
for (var i = 0; i < arr.length; i++) {  
for (var j = 0; j < arr.length-i; j++) {  
if (arr[j] < arr[j - 1]) {  
var temp;  
temp=arr[j];  
arr[j]=arr[j-1];  
arr[j-1]=temp; //下沉操作,即交換陣列值  
}  
}  
document.write(arr+'----');  
document.write('這是第'+(i+1)+'次排序結果'+'</br>')  
}  
}  
bubbleSort(a);  
//4.插入排序先把陣列中第一個數進入結果陣列中作為基準,然後依次選擇陣列中的數,如果比這個基準數大,則直接放到最後面,如果比這個數小,則依次向前比較,找到合適的地方後,挪出一個空位將其插入。
var a = [3,46,55,2,5,9,8,4,33,7];  
function insertSort(arr) {  
var result= [];  
result.push(arr[0]); //將第一個數最為基準  
document.write('第一次排序將陣列首個數字放入result結果集'+'</br>');  
for (var i = 1; i < arr.length; i++) {  
if (arr[i] > result[result.length - 1]) { //如果後來的數比基準數大,直接放到最後面  
result[result.length] = arr[i]; //也可以寫成result.push(arr[i]);  
}   
for (var j = result.length; j > 0 && arr[i] < result[j - 1]; j--) { //逐個向前比較,找到比自己大的則交換位置  
result[j] = result[j - 1];   
result[j - 1] = arr[i];   
}  
document.write(result+'----');  
document.write('這是第'+(i+1)+'次排序結果'+'</br>')  
}  
}  
insertSort(a); 
//5.選擇排序同樣先找一個基準數,如果後面的數比這個小,則交換,一輪下來找到便最小的數,以後以此類推,直至排序完畢。
var a = [3,46,55,2,5,9,8,4,33,7];  
function selectSort(arr) {  
var min=0;  
for (var i = 0; i < arr.length; i++) {  
min = i; //將陣列排好序部分的後一個數作為基準數  
for (var j = i + 1; j < arr.length; j++) {  
if (arr[min] > arr[j])  
min = j; //找到正確的最小數的陣列下標  
}  
if (min != i) { //將上面找到的陣列最小值同陣列排好序部分的後一個數替換位置  
arr[i]= [arr[min],arr[min]=arr[i]][0]; //交換元素的另一種方式,等效於上面冒泡的temp方式  
}  
document.write(arr+'----');  
document.write('這是第'+(i+1)+'次排序結果'+'</br>')  
}  
}  
selectSort(a);   
//6.快速排序利用遞迴的思想,取一個基準數,比它小的放在左邊,比它大的放在右邊,以此類推。
function quickSort(arr) {  
if(arr.length <= 1){return arr};  
var num = Math.floor(arr.length / 2); //向下取整  
var numValue = arr.splice(num, 1)[0]; //利用splice方法,取出一個元素,原陣列中將去掉這一個;arr.splice(num, 1)的結果是一個數組,因此要[0]一下  
var left = [];  
var right = [];  
for (var i = 0; i < l; i += 1) {  
arr[i] < numValue ? left.push(arr[i]) : right.push(arr[i]);  
}  
return quickSort(left).concat([numValue], quickSort(right));  
}