在进行各种排序算法之前,需要构造一个数组测试平台,之后的各个排序算法都在这个平台的基础上运行。
代码具体如下:
function CArray(numElements){
this.dataStore=[];
this.pos=0;
this.numElements=numElements;
this.insert=insert;
this.toString=toString;
this.clear=clear;
this.setData=setData;
this.swap=swap;
for (var i=0;i<numElements;++i){
this.dataStore[i]=i;
}
}
function setData(){
for (var i=0;i<this.numElements;++i)
{
this.dataStore[i]=Math.floor(Math.random()*(this.numElements+1));
}
}
function clear(){
for (var i=0;i<this.dataStore.length ;++i )
{
this.dataStore[i]=0;
}
}
function insert(element){
this.dataStore[this.pos++]=element;
}
function toString(){
var restr="";
for (var i=0;i<this.dataStore.length ;++i )
{
restr+=this.dataStore[i]+" ";
if(i>0&i%10==0){
restr+='\n';
}
}
return restr;
}
function swap(arr,index1,index2){
var temp=arr[index1];
arr[index1]=arr[index2];
arr[index2]=temp;
}
var numElements=100;
var myNums=new CArray(numElements);
myNums.setData();
print(myNums.toString());
在js shell中运行该代码,得到的结果:
下面我们开始正式进行排序算法的学习喽。
冒泡排序
冒泡排序最慢,但是最容易实现。
function bubbleSort(){
var numElements=this.dataStore.length;
var temp;
for(var outer=numElements;outer>=2;--outer){
for(var inner=0;inner<=outer-1;++inner){
if(this.dataStore[inner]>this.dataStore[inner+1]){
swap(this.dataStore,inner,inner+1);
}
}
}
}
同时不要忘记在CArray的构造函数中添加对这个函数的调用,
this.bubbleSort=bubbleSort;
否则会js shell会告知你如下错误
正确添加如上代码之后,我们可以测试一下冒泡函数啦,
var numElements=10;
var myNums=new CArray(numElements);
myNums.setData();
print(myNums.toString());
myNums.bubbleSort();
print();
print(myNums.toString());
运行,得到结果,很喜人的结果,哈哈
到这里,要说明一下我运行悟到的几件事:
1.在我们的js文件中有“//注释”的时候,js shell会报错!!真的会报错,什么UTF-8字符什么的,出现这种错误提示,大家去掉自己的注释试一下
2.可能你每次运行得到的数组都是不一样的,是因为随机数方法的原因,这个没有关系,只看冒泡算法的排序效果即可
3.js shell实际还是很有用的,我们继续。
想要对冒泡的过程一探究竟,只需要添加如下代码
function bubbleSort(){
var numElements=this.dataStore.length;
var temp;
for(var outer=numElements;outer>=2;--outer){
for(var inner=0;inner<=outer-1;++inner){
if(this.dataStore[inner]>this.dataStore[inner+1]){
swap(this.dataStore,inner,inner+1);
}
}
print(this.toString());//添加的代码
}
}
再次运行,得到的结果
是不是很神奇。
算法分析
1.时间复杂度
最好的情况下是O(n),最坏的情况下是O(n2)
平均事件复杂度是O(n2)
2.算法稳定性
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
选择排序
选择排序会从数组的开头开始,将第一个元素和后面的元素进行比较,由此进行完一轮之后,将最小的元素放到数组的第一个位置。然后将第二个元素和后面的元素进行比较,进行完一轮之后,将最小的元素放到数组的第二个位置。。。以此类推,直到倒数第二个数和最后一个元素进行比较之后,将较小的数放到倒数第二个位置上。由此,完成了数组的排序。‘
’
javascript代码如下:
function selectSort(){
var min,temp;
for (var outer=0;outer<=this.dataStore.length-2 ;++outer )
{
min=outer;
for(var inner=outer+1;inner<=this.dataStore.length-1;++inner){
if(this.dataStore[inner]<this.dataStore[min]){
min=inner;
}
swap(this.dataStore,outer,min);
print(this.toString());
}
}
}
别忘了在CArray的开头部分加上
this.selectSort=selectSort;
使用选择排序:
var numElements=5;
var myNums=new CArray(numElements);
myNums.setData();
print(myNums.toString());
myNums.selectSort();
print();
print(myNums.toString());
得出结论~开心~
插入排序
接下来就是本博的最后一个——插入排序
插入排序在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
插入排序有两个循环。外循环将数组元素挨个移动,而内循环则对外循环中选中的元素及它后面的那个元素进行比较。如果外循环中选中的元素比内循环中选中的元素小,那么数组元素会向右移动,为较小的元素腾出位置。
javascript代码如下:
function insertSort(){
var inner,temp;
for (var outer=1;outer<=this.dataStore.length-1 ;++outer )
{
temp=this.dataStore[outer];
inner=outer
while(inner>0&&(this.dataStore[inner-1]>=temp)){
this.dataStore[inner]=this.dataStore[inner-1];
--inner;
}
this.dataStore[inner]=temp;
}
}
参照上面两种算法使用这个算法就阔以。
【完】
—see you ~