5.快速排序
快速排序是对于冒泡排序的升级改进。
(1)基本思想:
在每一轮中任意找一个基准元素(一般为该序列的中间元素或者是第一个元素),利用该元素将待排序列分为两个部分,前面部分中的所有元素都比辅助元素小,后面部分中的所有元素都比辅助元素大,再利用快速排序的算法,分别对这两部分进行排序,不断递归,最后得到一个有序的序列。
(2)快速排序示意图:
图解说明:
a.选取 arr[left + right) /2] 元素为基准值
b.分别在从序列的前面找大于等于 pivo的元素,和后面小于等于pivot 的元素,将其交换,使得基准元素的前面的序列中全都是小于它的元素,后面的序列中全部是大于pivot的元素。
c.再分别对于基准元素前面的序列和后面的序列再进行快速排序,进行递归,最终得到排好的完整的序列。
(3)代码实现:
public void quickSort(int[] arr,int left,int right) {
int l = left;
int r = right;
int pivot = arr[(left + right) / 2];
int temp = 0; //临时变量,用于交换时
while( l < r) {
//从前面找,直到找到大于或者等于 pivot为止
while(arr[l] < pivot) {
l++;
}
//从后面找,直到找到小于或者等于 pivot为止
while(arr[r] > pivot) {
r--;
}
if(l >= r) {
break;
}
//找到了,交换
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
//交换完后,发现arr[l] == privot,则 r--,r前移
if(arr[l] == pivot){
r--;
}
//交换完后,发现arr[r] == privot,则 l++,l后移
if(arr[r] == pivot){
l++;
}
}
if(l == r){
l += 1;
r -= 1;
}
//向左递归
if(r > left){
quickSort(arr,left,r);
}
//向右递归
if(l < right){
quickSort(arr,l,right);
}
}
其他排序算法请转 排序算法——希尔排序_小何小何h的博客-CSDN博客