归并排序
归并排序是一种分治算法,其思想是将原始数组切分成为较小的数组,知道每一个小树组只有一个位置,接着将小树组归并成为较大的数组,直到最后只有一个排序完毕的大数组。
1.将给定的包含n个元素的局部数组分割成为两个局部数组,每个数组包含n/2个元素
2.对两个数组执行排序
3.将排序好的两个数组整合成为一个大数组
快速排序
和归并排序一样,快速排序也使用分治的方法,将原始数组分 为较小的数组(但它没有像归并排序那样将它们分割开)。
(1) 首先,从数组中选择中间一项作为主元。
(2) 创建两个指针,左边一个指向数组第一个项,右边一个指向数组最后一个项。移动左指 针直到我们找到一个比主元大的元素,接着,移动右指针直到找到一个比主元小的元素,然后交 换它们,重复这个过程,直到左指针超过了右指针。这个过程将使得比主元小的值都排在主元之 前,而比主元大的值都排在主元之后。这一步叫作划分操作。
(3) 接着,算法对划分后的小数组(较主元小的值组成的子数组,以及较主元大的值组成的 子数组)重复之前的两个步骤,直至数组已完全排序。
实现过程
function ArrayList(){
var array = [];
this.insert = function(item){
array.push(item);
}
this.toString = function(){
return array.join();
}
this.bubbleSort = function(){//冒泡排序
var t;
var length = array.length;
for (var i = 0; i < length; i++) {
for (var j = 0; j < length-1; j++) {
if(array[j] > array[j+1]){
t = array[j];
array[j] = array[j+1];
array[j+1] = t;
}
}
}
}
this.selectionSort = function(){//选择排序
var t;
var length = array.length;
for (var i = 0; i < length-1 ; i++) {
for(var j = i+1; j < length ; j++){
if(array[j] < array[i]){
t = array[i];
array[i] = array[j];
array[j] = t;
}
}
}
}
this.insertionSort = function(){//插入排序
var t;
var length = array.length;
for (var i = 1; i < length; i++) {
var j = i;
t = array[i];
while(j > 0 && array[j-1] > t){
array[j] = array[j-1];
j--;
}
array[j] = t;
console.log(array);
}
}
/*归并排序*/
this.mergeSort = function(){
array = mergeSortSec(array);
}
var mergeSortSec = function(array){
var length,mid,right,left;
length = array.length;
if(length === 1){
return array;
}
mid = parseInt(length/2);
left = array.slice(0,mid);
right = array.slice(mid,length);
console.log(left);
return merge(mergeSortSec(left),mergeSortSec(right));
}
var merge = function(left,right){
var result = [];
var l=0,r=0;
while(l<left.length && r<right.length){
if(left[l] < right[r]){
result.push(left[l++]);
}else{
result.push(right[r++]);
}
}
while(left.length > l){
result.push(left[l++]);
}
while(right.length > r){
result.push(right[r++]);
}
return result;
}
/*快速排序*/
this.quickSort = function(){
quick(array, 0, array.length-1);
}
var quick = function(array, left, right){
var index;
if(array.length > 1){
index = partition(array,left,right);
if(left < index-1){
quick(array ,left ,index-1);
}
if(index < right){
quick(array, index ,right);
}
}
}
var partition = function(array, left, right){
var cnt = array[parseInt((left + right)/2)],
i = left,
j = right,
t;
while( i <= j ){
while (array[i] < cnt){
i++;
}
while( array[j] > cnt){
j--;
}
if( i <= j){
t = array[j];
array[j] = array[i];
array[i] = t;
j--;
i++;
}
}
return i;
}
}
方法使用
var arr = new ArrayList();
arr.insert(9);
arr.insert(6);
arr.insert(7);
arr.insert(2);
arr.insert(5);
arr.insert(1);
arr.insert(8);
arr.insert(4);
arr.insert(3);
console.log(arr.toString());/*[9,6,7,2,5,1,8,4,3]*/
/*console.log(arr.bubbleSort());
arr.selectionSort();
arr.insertionSort();
arr.mergeSort();*/
arr.quickSort();
console.log(arr.toString());/*[1,2,3,4,5,6,7,8,9]*/