大家接触编程辣么久了,不知道有没有听说过这样一个说法——对计算机中储存数据执行的最常见的两种操作是排序和检索。不知道你们信不信,反正我信了。最基本的排序方法有三种,分别是冒泡、选择和插入。下面就给大家分别介绍一下这三种基本排序方法的javaScript实现。
首先,声明一个测试类,这个测试类包含了后面将要用到的排序方法
//测试类
function CArray(elements){
this.dataStore=[];
this.elements=elements;//elements为数组长度
this.insert=insert;
this.toString=toString;
this.clear=clear;
this.setData=setData;//初始化数组的方法
this.bubbleSort=bubbleSort;//冒泡
this.selectSort=selectSort;//选择
this.insertSort=insertSort;//插入
for(var i=0;i<elements;i++){
this.dataStore[i]=i;
}
}
function setData(){
for(var i=0;i<this.elements;i++){
this.dataStore[i]=Math.floor(Math.random()*(this.elements+1));
}
}
function clear(){
for(var i=0;i<this.elements;i++){
this.dataStore[i]=0;
}
}
function insert(element){
this.dataStore.push(element);
}
function toString(){
var restr="";
for(var i=0;i<this.elements;i++){
restr+=this.dataStore[i]+" ";
if((i+1)%10==0){
restr+="\n";
}
}
return restr;
}
//swap方法通过下标交换数组内的两个数据
function swap(arr,index1,index2){
var temp=arr[index1];
arr[index1]=arr[index2];
arr[index2]=temp;
}
一、冒泡排序
冒泡排序的基本原理是比较相邻的数值,当左值大于右值时交换他们的位置,多次循环。冒泡排序是最慢的排序算法之一,但却最好实现
//冒泡排序
function bubbleSort(){
//设置n为数组长度
var n=this.elements;
//外循环一共进行n-1次,按原理每个元素都会与其他元素进行比较以确定其正确位置,应执行n次,但到第n-1次时只剩下两个元素未排序,交换之后就相当于同时确定了两个元素的位置
for(var outer=n;n>=2;n--){
//内循环选出该趟最大值
for(var inner=0;inner<=outer-1;inner++){
if(this.dataStore[inner]>this.dataStore[inner+1]){
swap(this.dataStore,inner,inner+1);
}
}
}
}
二、选择排序
选择排序从第一个元素开始,将第一个元素与其他元素比较,最小的元素会被交换到第一个位置,然后移到第二个元素以此类推
//选择排序
function selectSort(){
var min;
var n=this.elements;
//外循环进行n-1次,因为进行到第n-1次,最大的元素与第二大元素进行交换,相当于同时确定两个元素的位置
for(var outer=0;outer<=n-2;outer++){
min=outer;
for(var inner=outer+1;inner<=n-1;inner++){
if(this.dataStore[inner]<this.dataStore[min]){
min=inner;
}
}
//找出每趟最小值,与当前位置的元素进行交换
swap(this.dataStore,outer,min);
}
}
三、插入排序
插排类似于我们打麻将时码牌的过程,排序时,数组分为两部分,前面一部分为排好序的元素,后一部分为没有排好序的部分。每次排序就将最前面一个未排序的元素在前面已经排好序的元素中找到自己的位置
function insertSort(){
var inner,temp;
var n=this.elements;
//outer可理解为带排序元素的下标,下标比outer小的元素都已排好序
for(var outer=1;outer<=n-1;outer++){
//temp为带排序元素
temp=this.dataStore[outer];
for(inner=outer;inner>0;){
//如果temp前面一个元素比它大,则交换位置
if(this.dataStore[inner-1]>=temp){
swap(this.dataStore,inner-1,inner);
inner--;
}else{
break;
}
}
}
}
一般来说,在三种基本排序算法中,选择和插入要比冒泡快,插入排序是最快的一种。不过在处理较小数量数据的时候,三种排序方式看不出明显差别,而大数量数据的排序则需要更高级的算法才高效,之后我会为大家分享希尔、快速、归并和堆排序四种高级排序算法。