js陣列去重與排序
阿新 • • 發佈:2019-02-18
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);
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));
}
// 常見用法:迴圈兩次陣列,第二次迴圈與第一次迴圈的值比較,當兩次迴圈的值相等時,不加入到陣列中,其餘不等新增到新陣列中。
// 程式碼如下;
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的迴圈。
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));
}