排序算法:冒泡排序、选择排序、插入排序、堆排序、归并排序、计数排序、基数排序、桶排序、快速排序
-冒泡排序
基本思想
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,
让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
/**
* 冒泡排序
* 基本思想:
* 在要排序的一组数中,对当前还未排好序的范围内的全部数,
* 自上而下对相邻的两个数依次进行比较和调整,
* 让较大的数往下沉,较小的往上冒。
* 即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
*
* 第一轮:找到了最大值
* 第二轮:找到次最大值
* 有n个数据,比(n-1)次比完
* for循环嵌套 :外循环控制行,内循环控制列
* a[j] > a[j + 1] :从小到大
* a[j] < a[j + 1]:从大到小
*/
public void bubbleSort() {
int a[] = {49, 2, -16, 5, 7, 23, 45, 67, 76, 78, 35, 55, 54, 59, 36, 43, 82, 88, 41, 60, 70, 80};
int temp = 0;
for (int i = 0; i < a.length - 1; i++) {
for (int j = 0; j < a.length - 1 - i; j++) {//j < a.length - 1 也可以,不过多比较了,影响性能
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
//遍历数组
for (int arr : a) {
Log.e("TAG", "冒泡排序:" + arr);
}
}
代码实现
/**
* 选择排序:
* 在要排序的一组数中,选出最小的一个数与第一个位置的数交换;
* 然后在剩下的数当中再找最小的与第二个位置的数交换,
* 如此循环到倒数第二个数和最后一个数比较为止。
*
* 文字叙述过程:
* 第1趟比较:拿第1个元素依次和它后面的每个元素进行比较,
* 如果第1个元素大于后面某个元素,交换它们,经过第1趟比较,
* 数组中最小的元素被选出,它被排在第一位
* 第2趟比较:拿第2个元素依次和它后面的每个元素进行比较,
* 如果第2个元素大于后面某个元素,交换它们,经过第2趟比较,
* 数组中第2小的元素被选出,它被排在第二位
* ......
* 第n-1趟比较:第n-1个元素和第n个元素作比较,如果第n-1个元素大于第n个元素,交换它们
*/
public void selecrSort() {
int num[] = {34, -17, 3, 30, 98, 4, 66, 55, 77, 60, 88};
for (int i = 0; i < num.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < num.length; j++) {
if (num[i] > num[j]) {
minIndex = num[j] < num[minIndex] ? j : minIndex;
// int temp = num[j];
// num[j] = num[i];
// num[i] = temp;
}
}
int temp = num[i];
num[i] = num[minIndex];
num[minIndex] = temp;
}
//遍历数组
for (int arr : num) {
Log.e("TAG", "选择排序:" + arr);
}
}
插入排序
基本思想
在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,
使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
最好的情况下,即待排序序列按关键字已经有序排列,每趟操作只需1次或者0次移动
在最坏的情况下,即待排序序列按关键字逆排序序列,这时在第j趟操作中,为插入元素需要同前面的j个元素进行j次关键字比较,移动元素的次数为j+1次。此时有:总比较次数=n(n-1)/2次,总移动次数 = (n+2)(n-1)/2次
平均情况下:即在第j趟操作中,插入记录大约需要时间同前面的j/2个元素进行关键字比较,移动记录次数j/2+1次
代码实现
/**
* 插入排序:
* 给你一个无序的数组,或者一段需要排序的序列,
* 我们通常用第一个元素作为参考值,
* 从第二个元素开始和这个参考值进行比较,
* 比这个参考值大的时候放在这个参考值的后面,
* 比这个参考值小的时候在和这个参考值的前一位进行比较,
* 当比较至适当位置进行插入
*/
public void insertSort() {
int num[] = {34, -17, 3, 30, 98, 4, 66, 55, 77, 60, 88};
int temp;
//将第一个值看做一个有序序列
for (int i = 1; i < num.length; i++) {
temp = num[i];
//如果前一位(已排序的数据)比当前数据要大,那么就进入循环比较[参考第二趟排序]
while (i >= 1 && num[i - 1] > temp) {
//往后退一个位置,让当前数据与之前前位进行比较
num[i] = num[i - 1];
//不断往前,直到退出循环
i--;
}
//退出了循环说明找到了合适的位置了,将当前数据插入合适的位置中
num[i] = temp;
}
//遍历数组
for (int arr : num) {
Log.e("TAG", "插入排序:" + arr);
}
}
更多关于冒泡排序,选择排序、插入排序的
冒泡排序:
https://blog.csdn.net/qq_41679818/article/details/90296399
https://blog.csdn.net/NathanniuBee/article/details/83413879
选择排序:
https://blog.csdn.net/u011109881/article/details/80038573
插入排序:
https://blog.csdn.net/weixin_43956598/article/details/90181567
https://blog.csdn.net/qq_28081081/article/details/80594386