常用的集中排序算法及实现
1.冒泡法
- 算法描述:假设总共有n个元素需要排序,从第一位开始比较相邻两个元素,如果此次比较的首位元素比后位元素大,则交换顺序(让大元素排到后面),比较范围是n。第一次比较完之后,最大值应该排到末位,然后进行第二次比较,比较范围是n-1…依次类推,直到比较了n-1次之后这个排序完成。
- e.g代码实现
package com.leeyu.testsort;
import java.util.ArrayList;
import java.util.List;
public class TestSortMethod1 {
public static void main(String[] args) {
int[] array=new int[20];
for(int i=0;i<20;i++) {
array[i]= (int)Math.round(Math.random()*20);
}
int num=0;
for(int i:array) {
System.out.print(i+" ");
num++;
if(num%5==0) {
System.out.println();
}
}
for(int i=1;i<array.length;i++) {
for(int j=0;j<array.length-i;j++) {
if(array[j]>array[j+1]) {
int tmp=array[j+1];
array[j+1]=array[j];
array[j]=tmp;
}
}
}
System.out.println("**********");
num=0;
for(int i:array) {
System.out.print(i+" ");
num++;
if(num%5==0) {
System.out.println();
}
}
}
}
结果----------------------------
8 3 1 7 15
9 12 17 5 12
2 6 4 3 6
1 6 9 14 5
**********
1 1 2 3 3
4 5 5 6 6
6 7 8 9 9
12 12 14 15 17
选择排序
- 算法描述:依旧是排序n个元素,用第一个元素依次对比剩下的元素,如果后面元素比第一位元素小,则记录最小元素索引,等全部元素比对完成之后,交换记录的最小元素下标对应的元素和首位元素,之后再从第二位元素开始比对,知道比对完n-1个元素。
- e.g.算法实现
package com.leeyu.testsort;
public class TestSortMethod2 {
public static void main(String[] args) {
int[] array=new int[10];
int[] nums=new int[]{1,2,3,4,5,6,7,8,9,10};
for(int i=0;i<array.length;i++) {
int index=(int)Math.round((Math.random()*(nums.length-i-1)));
array[i]=nums[index];
nums[index]=nums[nums.length-1-i];
}
for(int i:array) {
System.out.print(i+" ");
}
System.out.println("************");
for(int i=0;i<array.length-1;i++) {
int min=i;
for(int j=i;j<array.length-1;j++) {
min=array[min]>array[j+1]?(j+1):min;
}
int tmp=array[i];
array[i]=array[min];
array[min]=tmp;
}
for(int i:array) {
System.out.print(i+" ");
}
}
}
结果------------------------------------------------
6 3 5 1 10 9 2 4 7 8 ************
1 2 3 4 5 6 7 8 9 10
插入法排序
- 描述:对于n个需要排序的元素,首先取出第二位元素和首位元素进行比较,若第二位元素要小,则把第二位元素插入到首位之前;然后取出第三位元素,先和第二位元素比较(此时第二位元素已经比首位元素大),如果比之要小,在和首位比较,若比首位小,则插入首位,若比首位大则插入到第二位…依次类推。
e.g
package com.leeyu.testsort;
public class TestSortMethod3 {
static int count=0;
public static void main(String[] args) {
int[] array=new int[10];
TestSortMethod3 testSortMethod3=new TestSortMethod3();
for(int i=0;i<array.length;i++) {
int num=(int)Math.round(Math.random()*9+1);
if(i!=0) {
while(testSortMethod3.isEqualToArray(num, array,i)) {
num=(int)Math.round(Math.random()*9+1);
TestSortMethod3.count++;
}
array[i]=num;
}else {
array[i]=num;
}
}
System.out.println(TestSortMethod3.count);
for(int i:array) {
System.out.print(i+" ");
}
for(int i=1;i<array.length;i++) {
int tmp=array[i];
int j=i-1;
for(;j>=0&&tmp<array[j];j--) {
array[j+1]=array[j];
}
array[j+1]=tmp;
}
System.out.println("***************");
for(int i:array) {
System.out.print(i+" ");
}
}
public boolean isEqualToArray(int i,int[] array,int j) {
boolean flag=false;
for(int n=0;n<j;n++) {
if(i==array[n]) {
flag=true;
}
}
return flag;
}
}
结果---------------
5
6 7 1 9 4 5 2 3 8 10 ***************
1 2 3 4 5 6 7 8 9 10
归并排序
- 描述:把相邻两个数据看做一个整体(一共有n/2个整体),进行排序,完成之后得到n/2个有序的子序列,然后把相邻两个子序列看做一个整体进行排序,得到n/4个有序的子序列…直到最后得到一个子序列。
- e.g
package com.leeyu.testsort;
import java.util.Arrays;
public class TestSortMethod4 {
public static void main(String[] args) {
int[] array=new int[10];
for(int i=0;i<array.length;i++) {
int num=(int)Math.round(Math.random()*9+1);
while(isExist(array, num, i)) {
num=(int)Math.round(Math.random()*9+1);
}
array[i]=num;
}
for(int i:array) {
System.out.print(i+" ");
}
System.out.println("-------------------------");
int[] sortedArray=devideArray(array);
for(int i:sortedArray) {
System.out.print(i+" ");
}
}
public static boolean isExist(int[] array,int num,int index) {
boolean flag=false;
for(int i=0;i<index;i++) {
if(num==array[i]) {
flag=true;
}
}
return flag;
}
public static int[] devideArray(int[] array) {
if(array.length<=1) {
return array;
}
int num=array.length/2;
int left[]=Arrays.copyOfRange(array, 0, num);
int right[]=Arrays.copyOfRange(array, num, array.length);
return sort(devideArray(left), devideArray(right));
}
public static int[] sort(int[] left,int[] right) {
int[] result=new int[left.length+right.length];
int i=0;
int j=0;
for(int k=0;k<result.length;k++) {
if(i>=left.length) {
result[k]=right[j];
j++;
}else if(j>=right.length) {
result[k]=left[i];
i++;
}else if(left[i]<right[j]) {
result[k]=left[i];
i++;
}else {
result[k]=right[j];
j++;
}
}
return result;
}
}
结果-----------------------------------------------
2 1 5 3 6 9 7 4 8 10 -------------------------
1 2 3 4 5 6 7 8 9 10