常见排序算法原理与实现
1.冒泡排序
基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
Java实现:
import java.util.Arrays;
public class BubbleSort {
public static void bubbleSort(int[] arr) {
int temp = 0;
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]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
public static void main(String[] args) {
int[] arr={1,3,5,3,2,6,9,5,8};
bubbleSort(arr);
System.out.println(Arrays.toString(arr));
}
}
2.快速排序
基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
Java实现:
public static void quickSort(int[] arr) {
qsort(arr, 0, arr.length - 1);
}
private static void qsort(int[] arr, int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high); // 将数组分为两部分
qsort(arr, low, pivot - 1); // 递归排序左子数组
qsort(arr, pivot + 1, high); // 递归排序右子数组
}
}
private static int partition(int[] arr, int low, int high) {
int pivot = arr[low]; // 枢轴记录
while (low < high) {
while (low < high && arr[high] >= pivot){
high--;
}
arr[low] = arr[high]; // 交换比枢轴小的记录到左端
while (low < high && arr[low] <= pivot){
low++;
}
arr[high] = arr[low]; // 交换比枢轴大的记录到右端
}
// 扫描完成,枢轴到尾
arr[low] = pivot;
// 返回的是枢轴的位置
return low;
}
3.选择排序
基本原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
Java实现:
private static void selectionSort(int[] array) {
// 每次循环找出相对最小值,并交换到头部
for (int i = 0; i < array.length - 1; i++) {
int min = i;
for (int j = i+1; j < array.length; j++) {
if (array[j] < array[min])
min = j;
}
int temp = array[min];
array[min] = array[i];
array[i] = temp;
}
}
4.插入排序
基本步骤:
1. 从第一个元素开始,该元素可以认为已经被排序
2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5. 将新元素插入到该位置后
6. 重复步骤 2 ~ 5
Java实现:
<pre name="code" class="java">// 插入排序
private static void insertSort(int[] arr) {
int key = 0, j = 0;
for (int i = 1; i < arr.length; i++) { // 默认第一个元素(下标从0开始)已经有序
key = arr[i]; // 待排序元素
j = i - 1;
while (j >= 0 && arr[j] > key) { // 待排序数较小
arr[j + 1] = arr[j]; // 后移
j--;
}
arr[j + 1] = key; // 插入待排序元素
}
}