缘由:上次给某同学讲
Collections.sort()
在Comparator接口重写compare方法,被比较规则卡壳,于是有了下文@Override
public int compareTo(Employee o) {
if(this.id > o.id)
return -1;
else if(this.id < o.id)
return 1;
else
return 0;
}
首先总结规律
这里以c语言标准qsort的cmp为例,Java等同理
下图中,传入两个参数,num1,num2,转换成整型就是a,b
如果a>b时,返回值>0则a排在b后面,对应的从小到大排序
如果a>b时,返回值<0则a排在b前面,对应的从大到小排序int cmp(const void* num1 ,const void* num2) {
int a = *(const int*)num1;
int b = *(const int*)num2;
if (a > b) {
return -1;//从大到小
}
else if (a == b) {
return 0;
}
else {
return 1;
}
}
以下面代码为例#include
int cmp(const void* num1 ,const void* num2) {
int a = *(const int*)num1;
int b = *(const int*)num2;
if (a > b) {
return -1;//从大到小
}
else if (a == b) {
return 0;
}
else {
return 1;
}
}
int main()
{
int k[10] = { 6,1,2,7,9,3,4,5,10,8 };
qsort(k, 10,sizeof(int), cmp);
for (int i = 0; i < 10; i++) {
printf("%d ", k[i]);
}
return 0;
}
如图中所示所有元素实现了从大到小的排序
然后我们开始说快速排序
百科定义:
快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
简单的说:
(默认以从小到大排序)
1.找基准,默认为数组的第一个
2.先从右向左找比基准小的,记录位置j
3.后从左向右找比基准大的,记录位置i
4.交换j,i位置的元素
5.j向左移动,找比基准小的数的位置
6.i向右移动,找比基准大的数的位置
7.交换i,j位置的元素
8.重复5-7步操作,直到i和j相遇,然后交换i和基准位置的数
9.对数组i的左半部分递归进行相同的操作
10.对数组的i的右半部分递归进行相同的操作