1. 冒泡排序(效率最低)
①原理: 相邻比较,如果第i个比i+1的值大,两个交换,对每个相邻的元素做这种操作,这样每次循环,一定可以找到剩余数组中最大的值,并且把最大值放到右边,依次循环, 最外层共需循环n-1次。
②效率:交换和比较操作次数都和O(n2)正比,需要O(n2)时间级别。
public class BubbleSort {
public static void main(String[] args) {
int score[] = { 67, 69, 75, 87, 89, 90, 99, 100 };
for (int i = 0; i < score.length - 1; i++) { //最多做n-1趟排序
for (int j = 0; j < score.length - i - 1; j++) { //对当前无序区间score[0......length-i-1]进行排序(j的范围很关键,这个范围是在逐步缩小的)
if (score[j] < score[j + 1]) { //把小的值交换到后面
int temp = score[j];
score[j] = score[j + 1];
score[j + 1] = temp;
}
}
System.out.print("第" + (i + 1) + "次排序结果:");
for (int a = 0; a < score.length; a++) {
System.out.print(score[a] + "\t");
}
System.out.println("");
}
System.out.print("最终排序结果:");
for (int a = 0; a < score.length; a++) {
System.out.print(score[a] + "\t");
}
}
}
2.选择排序(改进了冒泡排序,交换次数从
O(n2)减少到了
O(n),但比较次数仍为O(n2))
①原理:排序从数组最左边开始,设立一个标志,标志初始值为最左边的值的下标(0),然后用下一个值和标志下标的值做比较,如果下个值更小,则把标志设为这个下标值,依次比较,这样循环一遍,标志存的是最小的值得下标,然后最小值和初始下标的值交换。
public class ChoseSort {
public int[] ChoseSort(int[] intArr) {
for (int i = 0; i < intArr.length; i++) {
int lowIndex = i;
for (int j = i + 1; j < intArr.length; j++) {
if (intArr[j] < intArr[lowIndex]) {
lowIndex = j;
}
}
// 将当前第一个元素与它后面序列中的最小的一个 元素交换,也就是将最小的元素放在最前端
int temp = intArr[i];
intArr[i] = intArr[lowIndex];
intArr[lowIndex] = temp;
}
return intArr;
}
public static void main(String[] args) {
ChoseSort choseSort = new ChoseSort();
int[] intArr = { 5, 6, 9, 2, 4, 3, 8 };
int[] intArrAfterSort = choseSort.ChoseSort(intArr);
for (int arrItem : intArrAfterSort) {
System.out.print(arrItem + " ");
}
}
}
3.插入排序( 时间复杂度:O(n2),但通常情况下比冒泡排序快一倍,比选择排序略快)
原理:插入排序法的排序思想就是从数组的第二个元素开始,将数组中的每一个元素按照规则插入到已排好序的数组中以达到排序的目的.一般情况下将数组的第一个元素作为启始元素,从第二个元素开始依次插入.由于要插入到的数组是已经排好序的,所以只是要从右向左找到比插入点(下面程序中的insertNote)小(对升序而言)的第一个数组元素就插入到其后面.直到将最后一个数组元素插入到数组中,整个排序过程就算完成.
public class sorts {
public static void main(String[] args) {
int[] arr = new int[] { 800, 9, 3, 6, 12, 54, 35, 411, 3, 245, 1, 0, 4 };
InsertSort(arr);
}
public static int[] InsertSort(int[] arr) {
int i, j;
int insertNote;// 要插入的数据
int[] array = arr;
// 从数组的第二个元素开始循环将数组中的元素插入
for (i = 1; i < array.length; i++) {
// 设置数组中的第2个元素为第一次循环要播讲的数据
insertNote = array[i];
j = i - 1;
while (j >= 0 && insertNote < array[j]) {
// 如果要播讲的元素小于第j个元素,就将第j个元素向后移动
array[j + 1] = array[j];
j--;
}
// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
array[j + 1] = insertNote;
}
// 打印排序后的数组
System.out.println(Arrays.toString(array));
return array;
}
}