数组作为应用最为广泛的一种数据结构,对数组实现简单排序的思想是每一个开发者的基本功。虽然实际的业务开发中用的很少,但是作为开发者,我们更看重的是其中所体现的一种思想。
现设定一个数组 num
int[] num = new int[] { 1, 2, 3, 5, 4, 7, 1, 9, 2, 4, 5, 8, 9, 12, 45, 34, 56, 78, 233, 123, 987 };
我们定义一个打印数组的方法printOut
// 打印数组
public static void printOut(int[] num) {
System.out.print("[");
for (int i = 0; i < num.length; i++) {
if (i == num.length - 1) {
System.out.println(num[i] + "]");
} else {
System.out.print(num[i] + ",");
}
}
}
1.冒泡排序
假设有N个数据需要排序,则从第0个数开始,依次比较第0和第1个数据,如果第0个大于第1个则两者交换,否则什么动作都不做,继续比较第1个第2个…,这样依次类推,将数据最大的数排到数组尾,就像水里的泡泡一样往上冒
public static void bubbleSort(int[] num) {
System.out.println("------------冒泡排序法---------------------");
for (int i = 0; i < num.length; i++) {
for (int j = i + 1; j < num.length; j++) {
// num[i] > num[j] 排出来从小到大;
// num[i] < num[j] 排出来从大到小
if (num[i] > num[j]) {
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
}
}
冒泡排序的效率O(N*N),比较N*N/2,交换N*N/4;
2.简单选择排序
假设有N条数据,则暂且标记第0个数据为MIN(最小),使用OUT标记最左边未排序的数据,然后使用IN标记第1个数据,依次与MIN进行比较,如果比MIN小,则将该数据标记为MIN,当第一轮比较完后,最终的MIN与OUT标记数据交换,依次类推
// 简单选择排序
public static void selectSort(int[] num) {
System.out.println("------------选择排序法---------------------");
for (int i = 0; i < num.length - 1; i++) {// 做第i趟排序
int k = i;
for (int j = k + 1; j < num.length; j++) {// 选最小的记录
// 反向排序
// if (num[j] > num[k]) {
// k = j;// 记下目前找到的最大值所在的位置
// }
// 正向排序
if (num[j] < num[k]) {
k = j; // 记下目前找到的最小值所在的位置
}
}
// 在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换
if (i != k) { // 交换a[i]和a[k]
int temp = num[i];
num[i] = num[k];
num[k] = temp;
}
}
}
选择排序的效率:O(N*N),比较N*N/2,交换<N; 选择排序与冒泡排序比较,比较次数没有明显改变,但交换次数明显减少了很多
3.插入排序
插入排序是在部分数据有序的情况下,使用OUT标记第一个无序的数据,将其提取保存到一个中间变量temp中去,使用IN标记空位置,依次比较temp中的值与IN‐1的值,如果IN‐值大于temp的值,则后移,直到遇到第一个比temp小的值,在其下一个位置插入
// 插入排序
// 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
public static void insertSort(int[] unsorted) {
System.out.println("------------插入排序法 ------------------");
for (int i = 1; i < unsorted.length; i++) {
if (unsorted[i - 1] > unsorted[i]) {
int temp = unsorted[i];
int j = i;
while (j > 0 && unsorted[j - 1] > temp) {
unsorted[j] = unsorted[j - 1];
j--;
}
unsorted[j] = temp;
}
}
}
插入排序的效率:O(N*N), 比较N*N/4,复制N*N/4;插入排序在随机数的情况下,比冒泡快一倍,比选择稍快;在基本有序的数组中,插入排序几乎只需要O(N);在逆序情况下,并不比冒泡快;