选择排序
冒泡排序
快速排序
同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的。
不同的是,冒泡排序在每一轮只把一个元素冒泡到数列的一端。而快速排序在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列的一边,比它小的元素移动到数列的另一边,从而把数列拆分成了两部分。
1.选择基准元素
(1)最简单的方法是选择数列的第一个元素
(2)随机选择一个元素作为基准元素
2.元素的移动
(1)挖坑法
(2)指针交换法
3.实现原理
(1)定义一个基准元素(数列的第一个元素)。将基准元素赋值给中间变量temp;
(2)定义3个变量leftIndex、rightIndex、index(3个变量为索引,leftIndex为数列的最左侧的索引,rightIndex为数列的最右侧的索引,index=leftIndex)。从数列两端开始比较,先将右侧的值与基准元素进行比较,如果比基准元素大,rightIndex向左移动(–),再与基准元素进行比较,如果比基准元素小,将值赋给索引为leftIndex的元素,同时leftIndex向右移动(++),index=rightIndex。再将左侧的值与基准元素进行比较,如果比基准元素小,leftIndex箱右移动(++),在与基准元素进行比较,如果比基准元素大,将值赋给索引为leftIndex的元素,同时rightIndex向左移动(–),index=leftIndex。以此类推,直到leftIndex==rightIndex时这一轮循环结束。这一轮循环确定了基准元素在数列中的位置,并且将数列分为了左右两侧
(3)分别对分开的数列进行快速排序,(利用递归,递归结束的条件为leftIndex和rightIndex相等)
4.代码
public class QuickSort {
/*通过递归进行排序*/
public static void sort(int[] arr, int beginIndex, int endIndex) {
int index = partition(arr, beginIndex, endIndex);
if (beginIndex >= endIndex) {
return;
}
sort(arr, beginIndex, index - 1);
sort(arr, index+1, endIndex);
}
//排序方法
public static int partition(int[] arr, int beginIndex, int endIndex) {
int leftIndex = beginIndex;
int rightIndex = endIndex;
int index = beginIndex;
int temp = arr[beginIndex];
while (leftIndex < rightIndex) {
while (leftIndex < rightIndex) {
if (arr[rightIndex] < temp) {
arr[leftIndex] = arr[rightIndex];
leftIndex++;
index = rightIndex;
break;
}
rightIndex--;
}
while (leftIndex < rightIndex) {
if (arr[leftIndex] >= temp) {
arr[rightIndex] = arr[leftIndex];
rightIndex--;
index = leftIndex;
break;
}
leftIndex++;
}
}
arr[index] = temp;
return index;
}
//测试方法
public static void main(String[] args) {
int[] arr={ 49, 38, 65, 97, 23, 22, 76, 1, 5, 8, 2, 0, -1, 22 };
sort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
}
//最后的结果为:[-1, 0, 1, 2, 5, 8, 22, 22, 23, 38, 49, 65, 76, 97]
源码中的排序
- 长度>= 286 采用归并排序
- 47<=长度<286 采用快速排序
- 长度 <47 插入排序
- 特别的:byte数组长度大于29、short或char数组长度大于3200 ==> 计数排序