package test105;
/*
* 冒泡排序的三种解以及选择排序
*/
public class Demo {
public static void main(String args[]) {
int[] Array={3,2,1,4,2,5,8};
int[] reverseArray=bubbleSort1.reverse(Array);
for(int i:reverseArray) {
System.out.print(i+",");
}
System.out.println();
//bubbleSort1.rank(Array);
//bubbleSort2.sort2(Array, 7);
bubbleSort3.sort3(reverseArray, 7);
for(int i:reverseArray) {
System.out.print(i+",");
}
System.out.println();
selectSort.toSmall(Array);
for(int i:Array) {
System.out.print(i+" ");
}
System.out.println();
selectSort.toBig(Array);
for(int i:Array) {
System.out.print(i+" ");
}
}
}
package test105;
public class bubbleSort1 {
public static int[] reverse(int []list) {
int []result=new int[list.length];
for(int i=0,j=result.length-1;i<list.length;i++,j--) {
result[j]=list[i];
}
return result;
}
public static int[] rank(int[]list) {
int n=0,m=0;
for(int i=0;i<list.length-1;i++) {
for(int j=0;j<list.length-i-1;j++) {
if(list[j]>list[j+1]) {
int a=list[j];
list[j]=list[j+1];
list[j+1]=a;
n++;
}
}
m+=n;
}
System.out.println(m);
return list;
}
}
package test105;
/*
* 如果对于一个本身有序的序列,或序列后面一大部分都是有序的序列,采用第一种方法会浪费很多的时间开销
* 这里设置一个标志flag,如果这一趟发生了交换,则为true,否则为false。所以如果有一趟没有发生交换,
* 说明排序已经完成
*/
public class bubbleSort2 {
public static void sort2(int []a,int n) {//表示数组a[]和n个元素
int i,k=n;
boolean flag=true;//发生了交换就为true,没发生就为false,第一个判断时必须标志为true
while(flag) {
flag=false;//每次开始排序前,都设置flag为未排序过
for(i=0;i<k-1;i++) {
if(a[i]>a[i+1]) {
int temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
flag=true;//表示交换过数据
}
}
k--;//减小一次排序的尾边界
}
}
}
package test105;
/*
* 现在有一个包含1000个数的数组,仅前面100个无序,后面900个都已排好序且都大于前面100个数字,
* 那么在第一趟遍历后,最后发生交换的位置必定小于100,且这个位置之后的数据必定已经有序了,
* 也就是这个位置以后的数据不需要再排序了,于是记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。
*/
public class bubbleSort3 {
public static void sort3(int []a,int n) {
int j,k;
int flag=n;
while (flag>0) {
k=flag;//k来记录遍历的尾边界
flag=0;//每次开始排序前,都设置flag为未排序过
for(j=0;j<n-1;j++) {
if(a[j]>a[j+1]) {
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=j;//表示交换过数据,并且记录最新的尾边界
}
}
}
}
}
//选择排序
package test105;
public class selectSort {
public static int[] toSmall(int[] a) {//从小到大排序
for(int i=0;i<a.length-1;i++) {//遍历数组出最后一个的其他所有数,因为最后的对象没有与之可以相比较的数
for(int j=i+1;j<a.length;j++) {
/*遍历数组里没有排序的所有数,并与上一个数进行比较
* j=i+1是因为自身一定等于自身,所以相比没有意义
* 与前面已经排好序的数再比较也没有意义
*/
if(a[j]<a[i]) {
int temp=a[j];
a[j]=a[i];
a[i]=temp;
}
}
}
return a;
}
public static int[] toBig(int []a) {//从大到小排序
for(int i=0;i<a.length-1;i++) {
for(int j=i+1;j<a.length;j++) {
if(a[j]>a[i]) {
int temp=a[j];
a[j]=a[i];
a[i]=temp;
}
}
}
return a;
}
}
//插入排序
public class insertSort {
public static void iSort(int []a) {
int insertNote;//标识要插入的数据
for(int index=1;index<a.length;index++) {
int leftIndex=index-1;//从数组的第二个元素开始循环,将数组中的元素插入
insertNote=a[index];//设置数组中的第2个元素为第一次循环要插入的数据
while (leftIndex>=0 && insertNote<a[leftIndex]) {
a[leftIndex+1]=a[leftIndex];//如果要插入的元素小于左索引位的元素,那么就将左索引位元素向后移动
leftIndex--;
}
a[leftIndex+1]=insertNote;//直到要插入的元素不小于第leftIndex个元素,将要插入的数据插入到数组
}
}
}
Java之排序算法
猜你喜欢
转载自blog.csdn.net/KJM15656556261/article/details/88652641
今日推荐
周排行