这边不讲睡眠的排序法,睡眠排序法有他的优点,但弊大于利。
排序操作:普通排序法,冒泡排序法,选择排序法
移动操作:插入排序法
普通排序法
import java.util.Scanner;
public class shuzupaixu {
public static void main(String[] args) {
int []a=new int[10];
int t;
Scanner in=new Scanner(System.in);
for(int c=0;c<a.length;c++) { //输入10个数
a[c]=in.nextInt();
}
for(int i=0;i<a.length-1;i++) { //普通排序法,开头用a[0]与a[1]比
for(int j=i+1;j<a.length;j++) {
if(a[i]<a[j]) { //a[0]小于a[1]则a[0]a[1]交换
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(int k:a) {
System.out.println(k);
}
}
}
普通排序法的过程是:
int []a={1,2,3,4,5};
for(int i=0;i<a.length-1;i++) {
for(int j=i+1;j<a.length;j++) {
if(a[i]<a[j]) { //小的往后移
t=a[i];
a[i]=a[j];
a[j]=t;}}}
数组a原内容为1,2,3,4,5
i=0{
首先是a[0]与a[1]比,a[0]<a[1]交换,此时数组为2,1,3,4,5 然后j++
这时j=2则是a[0]与a[2]比,交换后数组为3,1,2,4,5 j++
j=3 a[0]与a[3]比,交换后数组为4,1,2,3,5 j++
j=4 a[0]与a[4]比,交换 5,1,2,3,4
}
i=1{
j=i+1=2 a[1]与a[2]比,交换,则数组为5 ,2,1,3,4 j++
j=3 a[1]与a[3]比,交换 5,3,1,2,4 j++
j=4 a[1]与a[4] 5,4,1,2,3 j++
}
i=2{
j=i+1=3 a[2]与a[3] 5,4,2,1,3 j++
j=4 a[2]与a[4] 5,4,3,1,2
}
i=3{
j=i+1=4 a[3]与a[4] 5,4,3,2,1
冒泡排序法
import java.util.Scanner;
public class shuzupaixu {
public static void main(String[] args) {
int []a=new int[10];
int t;
Scanner in=new Scanner(System.in);
for(int c=0;c<a.length;c++) {
a[c]=in.nextInt();
}
for(int i=0;i<a.length;i++) {
for(int j=0;j<a.length-1;j++) {
if(a[j]<a[j+1]) {
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(int k:a) {
System.out.println(k);
}
}
}
冒泡排序法过程:
int []a={1,2,3,4,5};
for(int i=0;i<a.length-1;i++) {
for(int j=0;j<a.length;j++) {
if(a[i]<a[j]) { //小的往后移
t=a[i];
a[i]=a[j];
a[j]=t;}}}
数组a原内容为1,2,3,4,5
i=0{
j=0 a[0]与a[1]比,a[0]<a[1] 则交换后得2,1,3,4,5 j++
j=1 a[1]与a[2]比 交换后的2,3,1,4,5 j++
j=2 a[2]与a[3]比 交换后的2,3,4,1,5 j++
j=3 a[1]与a[2]比 交换后的2,3,4,5,1
}
i=1{
j=0 a[0]与a[1]比 交换后的3,2,4,5,1 j++
j=1 a[1]与a[2]比 交换后的3,4,2,5,1 j++
j=2 a[2]与a[3]比 交换后的3,4,5,2,1
}
i=2{
j=0 a[0]与a[1]比 交换后的4,3,5,2,1 j++
j=1 a[1]与a[2]比 交换后的4,5,3,2,1
}
i=3{
j=0 a[0]与a[1]比 交换后的5,4,3,2,1 }
选择排序法
import java.util.Scanner;
public class shuzupaixu {
public static void main(String[] args) {
int []a=new int[10];
int t,k;
Scanner in=new Scanner(System.in);
for(int c=0;c<a.length;c++) {
a[c]=in.nextInt();
}
for(int i=0;i<a.length;i++) {
k=i;
for(int j=i+1;j<a.length;j++) {
if(a[k]<a[j]) {
k=j;
}
if(k==j) {
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
}
for(int c:a) {
System.out.println(c);
}
}
}
选择排序法过程:
int []a= {1,2,3,4,5};
int t,k;
for(int i=0;i<a.length;i++) {
k=i;
for(int j=i+1;j<a.length;j++) {
if(a[k]<a[j]) {
k=j;
}
if(k==j) {
t=a[i]; //注意这里交换数据的细节,不然会把后面弄乱
a[i]=a[k];
a[k]=t;
}
}
}
i=0{
k=0 j=1 k=1 交换后得2,1,3,4,5 j++
k=1 j=2 k=2 交换后得3,1,2,4,5 j++
k=2 j=3 k=3 交换后得4,1,2,3,5 j++
k=3 j=4 k=3 交换后得5,1,2,3,4
}
i=1{
k=1 j=2 k=2 交换后得5,2,1,3,4 j++
k=2 j=3 k=3 交换后得5,3,1,2,4 j++
k=3 j=4 k=4 交换后得5,4,1,2,3
}
i=2{
k=2 j=3 k=3 交换后得5,4,2,1,3 j++
k=3 j=4 k=4 交换后得5,4,3,1,2
}
i=3{
k=3 j=4 k=4 交换后得5,4,3,2,1}
插入排序法
public class charu {
public static void main(String[] args) {
int t;
int []a= {1,2,3,4,5};
for(int i=1;i<a.length;i++) {
t=a[i];
int j=i;
for(;j>0&&t>a[j-1];j--) {
a[j]=a[j-1];
}
a[j]=t;
}
for(int k:a) {
System.out.print(k+" ");
}
}
}
插入排序法原理
外层循环
首先令i=1,j=i。i=1的原因是先让a[1]跟a[0]比较,j随i的值变而变,用t装着a[1]的值。
内循环条件是如果j>0并且大于a[j]-1第一次的a[j-1]是a[0]就是保证a[1]跟a[0]比较,在j--
i=1, j=1 , a[1]=2, t=2, 1>0&&a[1]=2>a[0]=1, 将1移到a[1],j--=0,a[0]=2 a[1]=1
{
i=2, j=2 , a[2]=3, t=3, 3>0&&a[2]=3>a[1]=1, 将1移到a[2],j--=1,a[1]=3 a[2]=1
接着j=1,j>0&& a[1]=3>a[0]=2, a[0]=3,a[1]=2,a[1]=1;}
{
{i=3, j=3 , a[3]=4, t=4, 4>0&&a[3]=4>a[2]=1, 将1移到a[3],j--=2,a[2]=4 a[3]=1
接着j=2,2>0&&a[2]=4>a[1]=2, a[1]=4,a[2]=2,a[3]=1; j--=1 1>0&&a[1]=4>a[0]=3, a[0]=4,a[1]=3,a[2]=2,a[3]=1;}
{
{i=4, j=4 , a[4]=5, t=5, 5>0&&a[4]=5>a[3]=1, 将1移到a[4],j--=3,a[3]=5 a[4]=1
接着j=3, 3>0&&a[3]=5>a[2]=2, a[1]=3,a[2]=5,a[3]=2; j--=2 2>0&&a[2]=5>a[1]=3, a[0]=4,a[1]=5,a[2]=3,a[3]=2,a[4]=1; j--=1 1>0&&a[1]=5>a[0]=4, a[0]=5,a[1]=4,a[2]=3,a[3]=2,a[4]=1;}