选择排序:
在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找
最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
Selection.java
package com.briup.ch04;
import java.util.Arrays;
public class Selection{
public void s1(){
int n[] = {23,6,18,2,11};
int i,j;
for(i=0;i<n.length-1;i++){
int min = i;
//定义一个min接收a[i]角标的值,用于后面交换时调用
for(j=i+1;j<n.length;j++){
if(n[min]>n[j]){
min = j;
//把最小数的角标赋值给min,这样min的值就是数组最小数的角标。
}
}
if(min!=i){
//通过角标交换当前位与最小位的数据,min=i的时候说明无需交换
int x = n[min];
n[min] = n[i];
n[i] = x;
}
}
System.out.println(Arrays.toString(n));
}
public static void main(String args[]){
Selection s = new Selection();
s.s1();
}
}
冒泡排序:
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次
进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们
的排序与排序要求相反时,就将它们互换。
Bubble.java
import java.util.Arrays;
public class Bubble{
public void b1(){
int n[] = {23,6,18,2,11};
int i,j;
for(i=1;i<n.length;i++){
//i表示要比较的次数
for(j=0;j<n.length-1;j++){
if(n[j]>n[j+1]){
//按顺序对相邻的两个数进行比较,较大的放到后面
int tem = n[j];
n[j] = n[j+1];
n[j+1] = tem;
}
}
}
System.out.println(Arrays.toString(n));
}
public static void main(String args[]){
Bubble b = new Bubble();
b.b1();
}
}
插入排序:
排序过程的某一中间时刻,数组R被划分成两个子区间R[1..i-1](已排好序的有序区)和
R[i..n](当前未排序的部分,可称无序区)。
插入排序的基本操作是将当前无序区的第1个记录R[i]插人到有序区R[1..i-1]中适当的
位置上,使R[1..i]变为新的有序区。因为这种方法每次使有序区增加1个记录,通常称增量法。
插入排序与打扑克时整理手上的牌非常类似。摸来的第1张牌无须整理,此后每次从桌上的
牌(无序区)中摸最上面的1张并插入左手的牌(有序区)中正确的位置上。为了找到这个正确
的位置,须自左向右(或自右向左)将摸来的牌与左手中已有的牌逐一比较。
Insertion.java
import java.util.Arrays;
public class Insertion{
public void ins1(){
int i,j;
int a[] = {5,7,12,-9,0};
for(i=1;i<a.length;i++){
int tem = a[i];
//当前需要排序的数
for(j=i;j>0;j--){
if(tem<a[j-1]){
//当tem<a[j-1]把a[j-1]的值赋给a[j],也就是把tem往前移一位,直到a[j-1]>tem
//由于从第一个开始排序,所以当a[j-1]>tem时,前面的数组排序已经完成
a[j]=a[j-1];
System.out.println(Arrays.toString(a));
if(j-1==0)
//j=1且tem<a[j-1],交换他们的数据即可
a[j-1]=tem;
}else{
a[j]=tem;
//当tem>a[j-1]时,
break;
}
}
}
System.out.println(Arrays.toString(a));
}
public static void main(String args[]){
Insertion ins = new Insertion();
ins.ins1();
}
}