排序算法有很多,保持每天更新写一个,有时间会写多个。
一、冒泡排序算法
<span style="font-size:14px;">/**
* 冒泡排序 从小到大
* 算法思想:
* 将两个相邻的数据相比较(这里是从小到大排序), 如果后一个大于前一个就交换其值,
* 每一次经过遍历后就会比较出一个最大值,该最大值会被交换到最右边(相对于此次遍历而言)
* 每次遍历只能比较出一个“最大值”(相对于此次遍历而言),假设一个数组长度为n,那么需要遍历n-1次
* 才可以完全排序完,因此使用两层for循环,可以看出来,写多层循环的时候
* @param arr
* 源数组,待排序
* @return
*/
public static int[] bubbleSort(int[] arr) {
System.out.println("冒泡排序(从小到到):");
//这个for循环没遍历一次,就会将一个最大值放在“最右边”
//如果是从大到小排序则每次遍历后就会将一个最小的值排到“最左边”
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];
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}</span>
二、快速排序
// ==================== 快速排序 ========================//
/**
* 快速排序算法思想: 首先选取一个基准元素,通常那个是选取数组第一个元素或是最后一个元素(相对于此次遍历来说)。
* 通过一趟排序将要排序的数据分割成独立的两部分,
* 其中一部分的所有数据都比另外一部分的所有数据都要小,
* 然后再按此方法对这两部分数据分别进行快速排序,
* 整个排序过程可以递归进行,以此达到整个数据变成有序序列。
*
* @param a
* @return
*/
private static int[] quick(int[] a) {
if (a.length > 0) {
quickSort(a, 0, a.length - 1);
}
return a;
}
private static void quickSort(int[] a, int low, int high) {
if (low < high) { // 如果不加这个判断递归会无法退出导致堆栈溢出异常
int middle = getMiddle(a, low, high);
quickSort(a, 0, middle - 1);
quickSort(a, middle + 1, high);
}
}
private static int getMiddle(int[] a, int low, int high) {
// 选取基准元素
int temp = a[low];
//
while (low < high) {
// 找到比基准元素小的元素位置
// 从最右边开始将每一个元素和基元素比较,如果该元素比基准元素要大,那么就左移动一位继续进行比较
// 如果恰好temp为最小的元素,那么这个while会执行high次知道high和low相等。
while (low < high && a[high] >= temp) {
high--;
}
// 如果遍历时发现有比基元素更小的就赋值给基准元素,这个low和high可能会相等。
a[low] = a[high];
// 这个循环不执行的条件是:所选取的基准元素恰好是最小的元素,那么此时low和hignt是相等的,
// 因为在上一个while循环中hight做--运算。
while (low < high && a[low] <= temp) {
low++;
}
a[high] = a[low];
}
a[low] = temp;
return low;
}