五种排序方法比较

五种排序方法小结:

冒泡排序,选择排序,插入排序,希尔排序,快速排序

1、冒泡排序:
小的浮起来,重的沉下去
抓住位置,将一个固定位置与后面位置的相比,若后面的小于前面的,则交换位置,如:
5 6 4 7 1 9 2 3 8
抓住位置1,和后面的依次比较
4 6 5 7 1 9 2 3 8
1 6 5 7 4 9 2 3 8
最小的1上升到最前面
抓住位置2,和后面的依次比较
1 5 6 7 4 9 2 3 8
······接下来的都类似。
示例代码:
public void maopao(int[]a){
for(int i=0;i<a.length-1;i++){//i只需要循环到倒数第二个数就行了
for(int j=i+1;j<a.length;j++){

if(a[i]>a[j])
{//互换两个值
a[i]=a[i]+a[j];或者也可以: int temp=a[i];
a[j]=a[i]-a[j]; a[i]=a[j];
a[i]=a[i]-a[j]; a[j]=temp;
}
}
}
}
优点是简单通俗易懂,缺点是交换次数多,循环效率不高

2、选择排序:
与冒泡排序类似,但是抓住的是元素,抓住最小那个
3 7 6 5 2 8 9 4 1
首先抓住3,和后面比较,直到比2小,这时放开3,抓住2,2再和后面比较,最后放开2,抓住1,将
1,3的位置调换,此时最小的元素已经放在第一位了
1 7 6 5 2 8 9 4 3
接下来抓住7,步骤和上面类似

示例代码:public void choose(int[]a){
//先找到数组值最小的索引
for(int i=0;i<a.length;i++){
//先令每次循环开始时的第一个数组下标为最小索引
int lowerIndex=i;
for(int j=i+1;j<a.length;j++){
//判断。当Index所指向的值大于数组的某个值时,将最小索引的值改为数组下标
if(a[lowerIndex]>a[j]){
lowerIndex=j;
}
}
//循环结束时,得到的Index指向的值即为最小值
//将这个值与循环开始的第一个下标的值对换
int temp=a[lowerIndex];
a[lowerIndex]=a[i];
a[i]=temp;
}

}
优点同样是较容易理解掌握,缺点是循环效率不高
冒泡排序和选择排序都是前面与后面的比较,而下面的插入排序是后面与前面比较


3、插入排序:

3 7 5 6 2 8 9 4 1
第二项与第一项比较,不用换
第三项与第二项比较,交换位置,再与第一项比较,不用换.就相当于5是插在中间的
3 5 7 6 2 8 9 4 1
接下来的类似


示例代码:

public void ChaRu(int[]a){
//首先从数组的第二项开始,依次与左边比较
for(int i=1;i<a.length;i++){
for(int j=i;j>0;j++){
//如果左边的值大于右边,则交换位置
if(a[j]<a[j-1]){
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}

}
}
}
优点是交换的次数相对比较少,效率较高


4、希尔排序:
其基本思想是将数组的长度除以2,3,4…,即分成的块数,再分别进行插入排序,如:
3 7 5 6 2 8 9 4 1
共9个元素,9/2=4,分成2块,每块4个
3 7 5 6 2 8 9 4 1
将每块中相应位置的元素取出
3 2 1 7 8 5 9 6 4
每一块进行插入排序
1 2 3 7 8 5 9 4 6
还原到原来相应的位置
1 7 5 4 2 8 9 6 3
继续9/3=3,分成3块
1 7 5 4 2 8 9 6 3
插入排序
1 5 7 2 4 8 3 6 9
还原
1 2 3 5 4 6 7 8 9
接下来除以4……最后是除以9,分成9块,就相当于对一块进行插入排序

代码如下:

public void shell(int[]x){
//分组
for(int increment=x.length/2;increment>0;increment/=2){
//每个组中排序
for(int i=increment;i<x.length;i++){
int temp=x[i];
int j=0;
for(j=i;j>=increment;j-=increment){
if(temp<x[j]-increment){
x[j]=x[j-increment];
}else{break;}
}
x[j]=temp;
}

}
}
是以上四种中最高的,循环次数少

5、快速排序:
是以上循环效率最高的,抓住元素
5 7 6 3 2 8 9 4 1
最前面的与最后面的一个比较,交换位置
1 7 6 3 2 8 9 4 5
5再与1旁边没有比过的元素7相比,交换位置
1 5 6 3 2 8 9 4 7
5和7旁边没有比过的4比较,换位置
1 4 6 3 2 8 9 5 7
……接下来的情况依次类推,具体的代码略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值