虽然现在java API当中已经给我包装好了可以直接排序数组的API,但是作为一个程序员,最近基本的排序算法还是应该会的。
下面我汇总了四种常用的排序方法,如果以后发现了好的排序算法还是会继续添加的。
Number 1: 冒泡法 (Bubble Sort Algorithm) 英语名可能不对,知道的请留言我改正。
冒泡法算的上是最近本的了,它的基本概念是依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。如下:
public class BubbleSortAlgorithm{
public static void main(String[] args){
int[] a = new int[]{3,5,2,4,1,7,6,8};
int temp = 0;
for(int i=0; i<a.length-1; i++){
for(int j=i+1; j<a.length; j++){
if(a[j] < a[i]){
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
for(int i=0; i<a.length; i++){
System.out.print(a[i] + " ");
}
System.out.println();
}
}
Number 2: 选择排序法(Seletion Sort Algorithm)
选择排序法在效率上比冒泡高一点,因为它减少了交换的次数。它的概念是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。如下:
public class SelectionSortAlgorithm{
public static void main(String[] args){
int[] a = new int[]{3,1,5,2,6,4,8,7};
int temp = 0;
for(int i=0; i<a.length; i++){
int minIndex = i;
for(int j=i+1; j<a.length; j++){
if(a[minIndex] > a[j]){
minIndex = j;
}
}
temp = a[minIndex];
a[minIndex] = a[i];
a[i] = temp;
}
for(int m : a){
System.out.print(m + " ");
}
System.out.println();
}
}
Number 3: 插入排序法(Insert Sort Algorithm)
插入排序法的概念是假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[1…k]是局部有序的,保证了插入过程的正确性.插入排序是不稳定的排序。如下:
public class InsertSortAlgorithm{
public static void main(String[] args){
int[] a = new int[]{3,5,2,4,1,7,6,8};
int temp = 0;
for(int i=1; i<a.length; i++){
for(int j=i; (j>0)&&(a[j]<a[j-1]); j--){
temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
for(int m : a){
System.out.print(m + " ");
}
System.out.println();
}
}