序
在十大经典排序算法(动画演示)这篇博客的指导下,博主一点一点码出了十大排序算法,并写了菜鸟级注释,源码戳这里,下面记录一下自己的总结,基本上是从注释搬来的。
排序算法主要分两类,一类是比较类排序,一类是非比较类排序。
一、比较类排序
通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。比较类排序算法和核心在于比较,只是比较的方法不一样,主要有交换排序、插入排序、选择排序。
1.1 交换排序
即通过数与数之间地交换,如冒泡排序和快速排序。
冒泡排序:通过相邻两个数之间的比较,交换两个数的位置使之满足统一的规律(比如左边始终比右边小),不断将最大/小数“冒”出来放在顶端;
快速排序:还是通过不断交换,使得选中的基准数交换到属于它的位置(即左边全部小于或大于它,右边反之),然后固定不动,对左右两边的数重复这一操作,直到所有的数都固定不动。使用的是分治法,其实思路很简单,假设基准是左边第一个数,左边全是小于基准的数,操作就是把左边出现的大于基准的数与右边出现的小于基准的数对调位置,最后把最后一个小于基准的数和基准对调位置即可,然后对左右两边重复操作。
public static void QuickSort(int[] num, int left, int right) {
//如果left等于right,即数组只有一个元素,直接返回
if(left>=right) {
return;
}
//设置最左边的元素为基准值
int key=num[left];
//数组中比key小的放在左边,比key大的放在右边,key值下标为i
int i=left;
int j=right;
while(i<j){
//j向左移,直到遇到比key小的值
while(num[j]>=key && i<j){
j--;
}
//i向右移,直到遇到比key大的值
while(num[i]<=key && i<j){
i++;
}
//i和j指向的元素交换
if(i<j){
in