根据排序过程中涉及的存储器不同,可以讲排序方法分为两大类:一类是内部排序,指的
是待排序的几率存放在计算机随机存储器中进行的排序过程;另一类的外部排序,指的是
排序中要对外存储器进行访问的排序过程。
一、冒泡排序 (适用于数据量很小的情况)
原理:是最简单的一种排序,本质就是比较和交换。比较 n-1 趟,每趟排序比较相邻的元
素,按关键字的要求选择是否交换,使关键字最小/最大的记录上浮或下沉。
boolean didSwap;
int length = array.length;
for (int i = 0; i < length - 1; i++) {
didSwap = false ;
for (int j = 0; j < length - 1 - i; j++) {
if (array[j + 1] < array[j]) {
swap(array[j],array[j+1]);
didSwap = true ;
}
}
if (didSwap == false ) { //上一个循环比较结束而没有发生交换,但是每两个相
邻
break ; //元素都比较过了,说明已经有序
}
}
二、直接选择排序 (适用于数据量小且交换数据相对于比较更加耗时)
原理:是对冒泡排序的一种改进,减少冒泡排序的交换次数。比如从小到大排序,第一趟
从 array[1]-array[n-1]选择最小值与 array[0]交换,第二趟从 array[2]-array[n-1] 选择最小值与
array[1]交换,以此类推,比较 n-1 趟。不是每次比较都交换,而是用一个变量记录下最小
或者最大值的位置,一趟比较完成以后再交换。
从未排好的部分的第一个作为最小(最大)的,然后依次和剩余的元素比较,如果有
更小(更大)的,记下下标,以此作为新的最小(最大)值,继续比较,一趟结束后,然
后和第一个进行交换。
int n = array.length;
int min =0;
for (int i = 0; i < n - 1; i++) {
min = i;
for(int j= i+1; j < n; j++){
if(array[j] < array[min]){
min = j;
}
}
if(min != i){
swap(array[i],array[min]);
}
} 关键字比较次数一直