Java十大经典排序(含Java代码实现,备注清晰具体)
参考文章:https://blog.csdn.net/marcosyw/article/details/72794216
最近编程学了十大经典排序,打算整理到博客上,但由于时间有限,所以会分批整理到此文章上。
一、快速排序
首先要知道快排的原理。简单来说可分为三个步骤:
1、在要排序的数组中选出一个“基数”(通常选数组的第一位元素)
2、让数组中的元素与“基数”比较,比基数小则放左边,比基数大的则放右边
3、递归重复以上步骤。
单看上面三个步骤还是很抽象的,接下来是具体如何操作:
1、第一点选出基数是用来比较的,就不过多赘述。
2、第二点实现的方式是在数组的起始和末端分别设定一个头指针(最左端)和一个尾指针(最右端)。若头指针指向的元素小于等于基数,则头指针向右移动一位,若比基数大,则与基数交换位置。尾指针相反,若比基数大或相等则向左移,比基数小则与基数换位。最后重复循环以上步骤,直到头尾指针重合。则可以做到以基数为基准,小的放其左,大的放其右
3、第三步骤就是以上一个基数为分界线,分为左半边和右半边,把左半边当成一个整体,重复第一和第二个步骤,右半边同理。即是递归,第一次排序完后不断的分为左半边和右半边,并将左半边与右半边不断排序,直到最终排序完成。
原理图如下:

下面是代码:
public class QuickSort {
public static void main(String[] args) {
int[] arr = {6, 1, 5, 4, 9, 2, 11, 7, 8, 1};
int start = 0, end = arr.length - 1; //定义数组的开头和结尾为Start和end,因为后续分为左右两半时起始位置和末尾位置会变化
sort(arr, start, end); //sort方法就为快速排序核心逻辑,调用排序方法,将数组与数组的始末位置传入方法
for (int i : arr) { //遍历数组
System.out.print(i + "\t");
}
}
public static void sort(int[] arr, int start, int end) {
if (start > end){ //递归停止条件
return;
}
int mid = start, s = start, e = end; //定义基数为第start对应的元素,头指针和尾指针为数组起始和末尾索引
int temp = 0; //用于交换数组元素位置的中间变量
while (s < e) { //循环以下操作直到头尾指针重合
while (s < e && arr[mid] <= arr[e]) { //若尾指针对应元素比基数大,则尾指针左移
e--;
}
if (arr[mid] > arr[e]){ //若尾指针对应元素比基数小,则与基数交换位置
temp = arr[mid];
arr[mid] = arr[e];
arr[e] = temp;
mid = e;
}
while (s < e && arr[mid] >= arr[s]) { //若头指针对应元素比基数小,则头指针左移
s++;
}
if (arr[mid] < arr[s]){ //若头指针对应元素比基数大,则与基数交换位置
temp = arr[mid];
arr[mid] = arr[s];
arr[s] = temp;
mid = s;
}
}
sort(arr, start, mid - 1); //递归以上步骤的左半边
sort(arr, mid + 1, end); //递归以上步骤的右半边
}
}

浙公网安备 33010602011771号