三个基础排序方式
(排序皆以从小到大排序)
冒泡排序
思路:
1.指向数组中两个相邻的元素(最开始是数组头两个元素),并且比较它们的大小。
2.如果前面的元素大于后面的元素,交换两个元素的位置。
3.反之则不交换。
4.循环后移,每次将最大的元素移动到最后一个。
public class Sort {
// 冒泡排序
public static void bubbleSort(int[] array) {
// 每次循环,都能冒泡出一个最大元素放在最后,因此需要循环 array.length 次
for (int i = 0; i < array.length; i++) {
// 每次遍历,最后的元素已经是最大了,因此可以忽略,只需要遍历 0 到 array.length - i - 1中元素。
for (int j = 0; j < array.length - i - 1; j++) {
// 交换元素
if (array[j] > array[j + 1]) {
int temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
}
}
}
}
选择排序
思路:
1.先设定两个变量一个记录当前最大值,一个记录当前最大值的位置(索引—index)。
2.依次遍历后面的元素,如果发现比当前最大值大,则将最大值换为此元素,位置改为此元素位置。
3.直到遍历结束,将最大值的元素与最右边元素交换。
4.重复循环,直到排序完成。
public class Sort {
// 选择排序
public static void selectSort(int[] array) {
int max;
int maxindex;
//每次循环都选择出一个最大数,放在最后,循环数组长度减一次
for(int i=0;i<array.length-1;i++){
max=array[0];
maxindex=0;
//遍历寻找每次循环的最大值,每一次循环都已经选出了最大值,所以遍历时要省去最后几位已经选择出来的数 所以循环length-i次
for(int j=1;j<array.length-i;j++){
if(max<array[j]){
max=array[j];
maxindex=j;
}
}
array[maxindex]=array[array.length-i-1];
array[array.length-i-1]=max;
}
}
插入排序
思路:
1.选择数组倒数第二个元素,作为临时元素。
2.将临时元素与数组后面的元素进行比较,如果后面的元素小于临时元素,后面的元素前移。
3.如果后面的元素大于临时元素,或者已经移动到数组末尾,则将临时元素插入当前的空隙中。
4.重复循环直到排序完成。
public class Sort {
// 插入排序
public static void insertSort(int[] array) {
//从倒数第二个元素开始循环排序,直到第一个元素
for(int i=array.length-2;i>=0;i--){
int ls=array[i];//临时元素
int j=i+1;//j来表示临时元素后面的值
while(j<=array.length-1){
if (array[j] < ls) {
//元素前移,因为临时元素已经提出来了,可以直接前移而不是交换
array[j - 1] = array[j];
} else {
// 如果大于,则直接将临时元素插入,然后退出循环。
array[j - 1] = ls;
break;
}
j++;
}
if(j==array.length){
//如果达到末尾,将临时元素赋在末尾处
array[j-1]=ls;
}
}
}
三个排序方式的时间复杂度并没有相差多少,但由于冒泡排序运用“交换”方法最多,因而相对三者而言是较差的。
选择排序与插入排序的运用因情况而定,如果元素数组本身有很多处于正确位置的元素,那么插入排序使用效率相对优秀,反之则用选择排序。
当然就我个人而言,三大排序最为编程的基础,都是需要掌握的重点,且排序直接各有特点、优势,需要认真学习。