先推荐一篇博客:Java的八大排序算法
说明:本案例中采用的都是从小到大的排序方式。
排序的概念:排序是将一群数据,依次按照指定的顺序进行排列的过程。排序是数据处理中一种很重要的运算,同时也是很常用的运算,一般数据处理的25%时间都在进行排序。简单的说,排序就是把一组记录(元素)按照某个域的值的递增(由小到大)或者递减(由大到小)的次序重新排列的过程。
排序的分类:
(1)内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序,包括:交换式排序法、选择式排序法以及插入式排序法。
(2)外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序,包括:合并排序法和直接合并排序法。
交换式排序法属于内部排序法,是运用数据值比较后,根据判断规则对数据位置进行交换,从而达到排序的目的。
交换式排序包括:冒泡排序法(Bubble Sort)和快速排序法(Quick Sort)。
基本思想:相邻两个元素进行比较,如果发现前一个数比后一个数大则交换位置。内循环结束一次,将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素。当然也可以从后往前排。
特点:效率低、实现简单
public static void bubbleSort(int[] arr){
//思想:相邻两个元素进行比较,如果满足条件就进行位置置换
//内循环结束一次,将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素。当然也可以从后往前排。
int temp = 0;
//外层循环决定走几趟,arr.length-1趟
for(int i = 0; i < arr.length-1; i++){
//内层循环,开始逐个比较,如果发现前一个数据比后一个数据大则交换
for(int j = 0; j < arr.length-i-1; j++){
if(arr[j] > arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
//将重新排序后的数组打印出来看看
for(int k = 0; k < arr.length; k++){
System.out.println(arr[k]);
}
}
是对冒泡排序的一种改进。
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序。整个排序过程可以递归进行,以此达到整个数据变成有序序列。
特点:效率高,但是运行时比较占用CPU。
在此推荐一篇博客:快速排序的原理及其实现
public static void quickSort(int arr[], int low, int hight) {
int i, j, index;
if (low > hight) {
return;
}
i = low;
j = hight;
index = arr[i]; // 用子表的第一个记录做基准
while (i < j) { // 从表的两端交替向中间扫描
while (i < j && arr[j] >= index)
j--;
if (i < j)
arr[i++] = arr[j];// 用比基准小的记录替换低位记录
while (i < j && arr[i] < index)
i++;
if (i < j) // 用比基准大的记录替换高位记录
arr[j--] = arr[i];
}
arr[i] = index;// 将基准数值替换回 arr[i]
quickSort(arr, low, i - 1); // 对低子表进行递归排序
quickSort(arr, i + 1, hight); // 对高子表进行递归排序
//将重新排序后的数组打印出来看看
for(int k = 0; k < arr.length; k++){
System.out.println(arr[k]);
}
}
选择式排序法也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再根据原则交换位置后达到排序的目的。
选择式排序可以分为两种:选择排序法和堆排序法
思想:第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]进行位置交换;第二次从arr[1]~arr[n-1]中选取最小值,与arr[1]进行位置交换;......第n-1次从arr[n-2]~arr[n-1]中选取最小值与arr[n-2]进行位置交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
特点:效率低、实现简单。
public static void selectSort(int[] arr){
//从第一个元素依次和其他元素进行比较,在内循环第一次结束,数组中的最小值出现在头角标位置上,然后再开始排第二个位置
for(int i = 0; i < arr.length-1; i++){
for(int j = i+1; j arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
//将重新排序后的数组打印出来看看
for(int k = 0; k < arr.length; k++){
System.out.println(arr[k]);
}
}
插入排序法属于内部排序法,是对于欲排序的元素以插入的方式寻找该元素的适当位置,从而达到排序的目的。
插入式排序分为:插入排序法(Insertion sort)、谢耳排序法(shell sort)以及二叉树排序法(Binary-Tree sort)。
基本思想:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的值依次与有序表中的值进行比较,将它插入到有序表中适当的位置,使之成为新的有序表。
public static void insertSort(int arr[]){
for(int i = 1; i < arr.length; i++){
int insertVal = arr[i];
int index = i - 1;
//insertVal和i之前的有序数组中的每一个数进行比较,找到自己的位置
while(index >= 0 && insertVal < arr[index]){
//将arr[index]向后移动一位
arr[index+1] = arr[index];
//让index向前移动一位
index--;
}
//将insertVal插入合适的位置
arr[index+1] = insertVal;
}
System.out.println(Arrays.toString(arr));
}
}