关于排序算法,自己总是学了久不用就忘了,现在把他们记录下来。
冒泡排序
- 依次比较两个相邻的元素,将大的数放到右边
- 重复上一个过程
private static void bubbleSoft(int[] data) {
int length = data.length;
int temp = 0;
/**
* 设置一个flag变量进行调优,如果数组是无序的就会进入判断,让flag=true
* 如果数组是有序的,就不会进入判断,在最外层的for循环中判断flag的值,如果是有序的话
* 就提前退出循环
*/
boolean flag = false;
for (int i = 0; i < length - 1; i++) {
for (int j = 0; j < length - i - 1; j++) {
if (data[j] > data[j + 1]) {
temp = data[j];
data[j] = data[j + 1];
data[j + 1] = temp;
flag = true;
}
}
if (!flag) {
break;
}
}
for (int i = 0; i < length; i++) {
System.out.print(data[i] + " ");
}
}
快速排序
- 在数组中选一个基准数(通常是是数组的第一个数)
- 将数组中的小于基准数的移到左边,大于基准数的移到右边
- 对于基准数左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个元素,即为全部有序。
private static int[] quickSoft(int[] data, int start, int end) {
int pivot = data[start]; //设置数组的第一个数作为比较的基数
int i = start;
int j = end;
while (i < j) {
while ((i < j) && data[j] > pivot) {
j--; //j往前移动,直到遇到下标为j的数小于基数
}
while ((i < j) && data[i] < pivot) {
i++; //i往后移动,直到遇到下标为j的数大于基数
}
if ((data[i] == data[j]) && (i < j)) {
i++;//考虑两个数相等的情况
} else {
//将下标为i和j的数进行对调
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
//递归
if (i - 1 > start)
data = quickSoft(data, start, i - 1);
if (j + 1 < end)
data = quickSoft(data, j + 1, end);
return (data);
}
public static void main(String[] args) {
int data[] = {23, 1, 44, 67, 87, 45, 12, 34, 54};
int len = data.length - 1;
//bubbleSoft(data); //冒泡法排序
data = quickSoft(data, 0, len); //快速排序
for (int i : data) {
System.out.print(i+" ");
}
}