js数组去重与排序

来源:互联网 发布:js储存数据 编辑:程序博客网 时间:2024/04/30 13:24
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));  
}  
0 0