排序算法是什么呢?
首先,我们要知道排序是什么呢?
排序是计算机内经常用到的一种操作,所谓排序,就是一串数据根据其中的某种特性或某种特点,逐渐增加或逐渐递减的排列起来的一种操作。
那么算法又是什么呢?为什么要用算法来排序?
算法是描述解决问题的方法(解决特定问题的步骤描述),在计算机中表现为指令的有序序列,为了解决某个问题,就需要指令表示成一定的操作序列,而每一个操作也都代表着特定的功能,这就是算法了。
而排序算法就是在计算机中将数据按照要求排列的一种方法,尤其是在处理大量数据的时候,一个好的算法可以节省大量的资源,但是要想得到一个符合要求的优秀的算法,也必须经过大量的推算和分析。
快速排序
快速排序其实是对冒泡排序的一种改进,将数据进行不断的移动和比较来实现排序。
而快速排序算法,之所以说它快速的原因,并不是因为它比其他的排序算法都要快,而是从实践中证明了快速排序在平均性能上的确是比其他算法要快一些。
怎么用?
首先从一组数据中选择一个参照值,也可以说是对比值,根据参照值的大小将数据分割成两个独立的部分,一部分比参照值小(作为参照值左边的一部分),一部分比参照值大(作为参照值右边的一部分),参照值一般选择数据中的第一个。
第一次比较(循环):从后往前比较,用参照值和最后一个数据比较,如果最后一个值比参照值大,那么最后一个值不动,参照值继续往前比较,直到参照值找到比自己小的值,然后进行交换位置。交换位置以后,开始转换为从前往后比较,如果比较的数据比参照值小,那么比较的值不变,参照值继续往后比较,直到参照值找到比自己大的值,然后进行交换位置。
一次或者N次的循环结束后,此时的参照值位置已经确定了,而左边的值都比参照值小,右边的值都比参照值大,但是左右两边的值的排序还是不正确的。(注意:参照值交换的只是位置,并不是参照值改变,参照值是不变的)
public static void sort(int[] a, int left, int right) {
int start = left;
int end = right;
int key = a[left];
while (end > start) {
// 从后往前比较
while (end > start && a[end] >= key) // 如果没有比参照值小的,比较下一个,直到有比参照值小的交换位置,然后又从前往后比较
end--;
if (a[end] <= key) {
int temp = a[end];
a[end] = a[start];
a[start] = temp;
}
// 从前往后比较
while (end > start && a[start] <= key)// 如果没有比参照值大的,比较下一个,直到有比参照值大的交换位置
start++;
if (a[start] >= key) {
int temp = a[start];
a[start] = a[end];
a[end] = temp;
}
// 此时第一次循环比较结束,参照值的位置已经确定了。左边的值都比参照值小,右边的值都比参照值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
}
// 递归
if (start > left)
sort(a, left, start - 1);// 左边序列。第一个索引位置到关键值索引-1
if (end < right)
sort(a, end + 1, right);// 右边序列。从参照值索引+1到最后一个
}
public static void main(String[] args) {
int[] a = { 4, 9, 8, 3, 1, 2, 7, 5, 6 };
int start = 0;
int end = a.length - 1;
sort(a, start, end);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}