前言
排序问题一直是计算机技术研究的重要问题,排序算法的好坏直接影响到程序的执行速度和辅助存储空间。其中衡量一个排序算法的好坏是通过时间复杂度和空间复杂度判断的。
同一说明:
待排序的序列是{38,65,97,13,27,49}
选择排序
基本思想:
对于给定的一组待排序记录,经过第一轮比较后得到最小的记录,然后该记录和第一个记录进行位置交换;接着对不包括第一个记录外的其他记录进行第二轮比较,得到最小值和第二个值进行交换,重复上述过程,直到进行比较的记录只有最后一个为止。
(0):{38,65,97,13,27,49}
(1):{13,38,65,97,27,49}
(2):{13,27,38,65,97,49}
。。。
代码实现:
public static void selectSort(int[] a) {
//获取数组长度
int n = a.length;
//声明临时变量,用于交换值
int tmp = 0;
//声明flag代指当前待交换元素下标
int flag = 0;
for (int i = 0; i < n; i++) {
flag = i;
for (int j = i + 1; j < n; j++) {
if (a[flag] > a[j]) {
flag = j;
}
}
if (flag != i) {
tmp = a[i];
a[i] = a[flag];
a[flag] = tmp;
}
}
}
插入排序
基本思想:
对于给定得一组记录来说,假定第一个记录是有序得(当然这样),其余是待排序得。接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到已经完成排序了的记录中,直到最后一个记录插入到有序序列中为止。
(0):[38],65,97,13,27,49
(1):[38,65],97,13,27,49
(2):[38,65,97],13,27,49
(3):[13,38,65,97],27,49
。。。
代码实现:
public static void insertSort(int[] a) {
//这里避免下面a.length可能出现了空指针异常
if (a == null) {
return;
}
for (int i = 1; i < a.length; i++) {
int temp = a[i], j = i;
while (j >= 1 && a[j - 1] > temp) {
a[j] = a[j - 1];
j--;
}
//这个判断是为了j当前是否还是i,若是的话表名未移动,若不是,说明当前元素的移动了
if (j != i) {
a[j] = temp;
}
}
}
冒泡排序
相信各位在刚开始接触到C的时候就已经知道了BubbleSort这个排序方法。
基本思想:
对于给定的n个记录,从第一个记录开始依次对相邻的两个记录进行比较,如果前一个大于后一个,则交换顺序,这样每一次从头到尾的遍历一次都会有一个最大值到记录的最后一位。
(0):38,65,97,13,27,49
(1):38,65,49,13,27,[97]
(2):38,27,49,13,[65,97]
。。。
代码实现:
public static void bubbleSort(int[] a) {
if (a == null) {
return;
}
boolean flag;
int temp;
for (int i = 0; i < a.length; i++) {
flag = true;
for (int j = 0; j < a.length - 1 - i; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag = false;
}
}
if (flag) {
break;
}
}
}
好了,到这里已经写够长了,休息下,下一篇将归并和快速排序,再会!