您的位置:首页 > 编程语言 > Java开发

常见排序算法的Java实现代码汇总

2016-03-11 19:44 513 查看

常见排序算法原理与实现

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 ~ 5Java实现:
<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; // 插入待排序元素}}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: