最近想着封装一些常用的工具类。
先拿最常用最简单的数组排序来练练手。
日常操作中常见的排序方法有:冒泡排序、快速排序、选择排序、插入排序、希尔排序、堆排序、基数排序、归并排序等。
数字排序算法通常用来作为算法入门课程的基本内容,在实际应用(尤其是普通商业软件)中使用的频率较低,但是通过排序算法的实现,可以深入了解计算机语言的特点,可以以此作为学习各种编程语言的基础。
冒泡排序
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将这两个数按序排好。
示例:将数组用冒泡排序降序排列。
int[] a={11,22,66,44,33,55,88,99,77};
for(int i=0;i<a.length-1;i++){
//从1开始,到a.length-i-1结束。共a.length-i-1次。
for(int j=1;j<a.length-i;j++){
if(a[j-1] < a[j]){
int temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
写一个封装类,涵盖升序和降序:
/**
* 冒泡排序
* @param arr 待排序的数组
* @param asc 是否按升序排序
* @return 排序后的数组
*/
public static int[] bubbleSort(int[] arr,boolean asc){
for(int i=0;i<arr.length-1;i++){
//从1开始,到a.length-i-1结束。共a.length-i-1次。
for(int j=1;j<arr.length-i;j++){
if(asc?arr[j-1] > arr[j]:arr[j-1] < arr[j]){
int temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
}
}
}
return arr;
}
当然,也可以写2个小方法来区分升序和降序:
/**
* 冒泡排序,升序
* @param arr 待排序的数组
* @return 排序后的数组
*/
public static int[] bubbleSortAsc(int[] arr){
return bubbleSort(arr, true);
}
/**
* 冒泡排序,降序
* @param arr 待排序的数组
* @return 排序后的数组
*/
public static int[] bubbleSortDesc(int[] arr){
return bubbleSort(arr, false);
}
选择排序
基本思想是每次从待排数据中选择第n小的数据放到排序列表的第n个位置。
(假设数据放在一个数组a中,且数组的长度是N)
1:从a[0]-a[N-1]中选出最小的数据,然后与a[0]交换位置
2:从a[1]-a[N-1]中选出最小的数据,然后与a[1]交换位置(第1步结束后a[0]就是N个数的最小值)
3:从a[2]-a[N-1]中选出最小的数据,然后与a[2]交换位置(第2步结束后a[1]就是N-1个数的最小值)
以此类推,N-1次排序后,待排数据就已经按照从小到大的顺序排列了。
封装类:
/**
* 选择排序
* @param arr 待排序的数组
* @param asc 是否按升序排序
* @return 排序后的数组
*/
public static int[] selectSort(int[] arr,boolean asc){
for(int i=0;i<arr.length-1;i++){
//从i+1开始,到a.length-1结束。共a.length-i-1次。
for(int j=i+1;j<arr.length;j++){
if(asc?arr[i] > arr[j]:arr[i]<arr[j]){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
return arr;
}
同样,选择升序:
/**
* 选择排序,升序
* @param arr 待排序的数组
* @return 排序后的数组
*/
public static int[] selectSortAsc(int[] arr){
return selectSort(arr, true);
}
选择降序:
/**
* 选择排序,降序
* @param arr 待排序的数组
* @return 排序后的数组
*/
public static int[] selectSortDesc(int[] arr){
return selectSort(arr, false);
}