Java中常用的几个基础排序算法
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。
本文就冒泡排序,直接排序,快速排序简单写了下实现代码。
1、冒泡排序
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
public class Bubblesort {
public static void main(String[] args) {
int[] num = {12, 1, 3, 4, 6};
for (int i = 0; i < num.length - 1; i++) {
for (int j = 0; j < num.length - 1 - i; j++) {
if (num[j] > num[j + 1]) {
int temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(num));
}
}
2、选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
public class Selectionsort {
public static void main(String[] args) {
int[] num = {12, 1, 3, 4, 6};
for (int i = 0; i < num.length - 1; i++) {
int t = i;
for (int j = i + 1; j < num.length; j++) {
if (num[t] > num[j]) {
t = j;
}
}
if (t != i) {
int temp = num[i];
num[i] = num[t];
num[t] = temp;
}
}
System.out.println(Arrays.toString(num));
}
}
3、快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。 [1]
快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
public class Quicksort {
public static void main(String[] args) {
int[] num = {12, 1, 3, 4, 6};
quicksort(num, 0, num.length - 1);
System.out.println(Arrays.toString(num));
}
public static void quicksort(int arr[], int left, int right) {
if (left > right) {
return;
} else {
int index = getIndex(arr, left, right);
//递归排左边
quicksort(arr, left, index - 1);
//递归排右边
quicksort(arr, index + 1, right);
}
}
public static int getIndex(int[] arr, int left, int right) {
int key = arr[left];
while (left < right) {
//右侧比key大right向左,否则交换
while (arr[right] >= key && left < right) {
right--;
}
arr[left] = arr[right];
while (arr[left] <= key && left < right) {
left++;
}
arr[right] = arr[left];
}
arr[left] = key;
return left;
}
}