在java学习当中,经常会涉及到排序问题,虽然在今后的工作当中,有现成的API可以使用,但在学习过程中,排序问题是为了锻炼基础语句及数组,并且在面试的时候,也会有笔试题出现,所以掌握三种排序还是非常必要的。
三种排序:选择排序、冒泡排序、插入排序
选择排序:
原理:1.将数组中每个元素与第一个元素进行比较,如果这个元素小于第一个元素,则交换。
2.循环第一条规则,找出这个数组中最小的元素,放在第一个
3.经过 n-1 轮比较完成排序
举例:数组:array={8 , 2 , 3 , 7 , 1}
第一轮:array={1 | 8 , 3 , 7 , 2}
第二轮:array={1 , 2| 8 , 7 , 3}
第三轮:array={1 , 2 , 3 | 8 , 7}
第四轮:array={1 , 2 , 3 , 7 | 8}
代码参考:
import java.util.Arrays;
public class SortDemo {
public static void main(String[] args) {
int[] array = { 8, 2, 3, 7, 1 };
System.out.println(Arrays.toString(selectSort(array)));
}
public static int[] selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
}
冒泡排序:
原理:比较相邻的元素,将小的放在前面
举例:数组:array={8 , 2 , 3 , 7 , 1}
第一轮:ary={2, 8, 3, 7, 1} ,ary={2, 3, 8, 7, 1} ,ary={2, 3, 7, 8, 1} ,ary={2, 3, 7, 1 |8 }
第二轮:ary={2, 3, 7, 1 |8 } ,ary={2, 3, 7, 1 |8 } ,ary={2, 3, 1 | 7, 8 }
第三轮:ary={2, 3, 1 |7, 8 } ,ary={2, 1 | 3, 7, 8 }
第四轮:ary={1, 2, 3, 7, 8}
代码参考:
<pre name="code" class="java">import java.util.Arrays;
public class SortDemo {
public static void main(String[] args) {
int[] array = { 8, 2, 3, 7, 1 };
System.out.println(Arrays.toString(bubbleSort(array)));
}
public static int[] bubbleSort(int[] arr){
for(int i=0; i<arr.length-1; i++){
for(int j=0; j<arr.length-1-i; j++){
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
}
插入排序:
原理:1.将数组分为两部分,后一部分的元素逐个与前一部分元素进行比较,在合理位置插入
2.插入排序的效率要高于以上两种算法
举例:数组:array={8 , 2 , 3 , 7 , 1}
第一步,array={8 | 2 , 3 , 7 , 1} ,取出2(temp=2),将temp和8比较,比8小,将array[1]的位置赋予值8,因为是边界,所以array[0]的值为temp
完成2,8排序,则数组array={2 , 8 , 3 , 7 , 1}
第二步,array={2 , 8 | 3 , 7 , 1},取出3(temp=3),将temp和8比较,比8小,将array[2]的位置赋予值8,将temp和2比较,比2大,将array[1]的位置赋予值3
完成2,3,8排序,则数组array={2 , 3 , 8 , 7 , 1}
第三步,array={2 , 3 ,8 | 7 , 1},取出7(temp=7),将temp和8比较,比8小,将array[3]的位置赋予值8,将temp和3比较,比3大,将array[2]的位置赋予值3
完成2,3,7,8排序,组数组array={2 , 3 , 7 , 8 , 1}
第四步,array={2 , 3 , 7 , 8 | 1},取出1(temp=1),将temp和8比较,比8小,将array[4]的位置赋予值8,将temp和7比较,比7小,将array[3]的位置赋予值7,将temp和3比较,比3小,将array[2]的位置赋予值3,将temp和2比较,比2小,将array[1]的位置赋予值2,到边界,array[0]的值为temp
完成1,2,3,7,8,的排序,则数组array={1,2 , 3 , 7 , 8}
代码参考:
import java.util.Arrays;
public class SortDemo {
public static void main(String[] args) {
int[] array = { 8, 2, 3, 7, 1 };
System.out.println(Arrays.toString(insertSort(array)));
}
public static int[] insertSort(int[] arr){
int i,j,t;
for(i=1; i<arr.length; i++){
t = arr[i];
for(j=i-1; j>=0 && t<arr[j]; j--){
arr[j+1] = arr[j];
}
arr[j+1] = t;
}
return arr;
}
}
PS:也提一下Java API中也提供了排序——Arrays.sort(ary)