排序可分为内排序和外排序
内排序针对的是小数组,在内存中完成
外排序针对的是多个文件,在外存中完成
简单排序的复杂度普遍是O(n2)
冒泡排序
冒泡的意思就是小的数从下面浮上去,也就是从最后一个开始j与前面的j-1比较,直到比较到i。直到执行完一轮之后,第一个数就是全数组最小的数。执行n-1轮即可完成排序.i表示的是排序好的位置,j表示的是此轮比较的位置。
算法的复杂度稳定为O(n),排序不稳定,如果定义相同不交换则稳定
public void sort(int[] arr) {
for(int i=0;i<arr.length-1;i++){
for(int j=arr.length-1;j>i;j--){
if(arr[j]<arr[j-1]){
swap(arr,j,j-1);
}
}
}
选择排序
选择排序就是每轮都选一个最小的数放到最前面,用i来表示已经放好的位置,排序的复杂度保持不变为O(n2),不稳定
public void sort(int[] arr) {
for(int i=0;i<arr.length-1;i++){
int min=0;
for(int j=i;j<arr.length;j++){
if(arr[j]<min){
min=j;
}
}
swap(arr,i,min);
}
}
插入排序
将当前元素插入到之前已经排序好的队列中,需要注意的是i是从0到arr.length-1了,因为最后一个数也要往前排,还有条件是加到for循环之中了,这样就导致有的遍历可以省去,所以插入排序的最好复杂度为O(n),最坏为O(n2),平均为O(n2),不稳定。但可以通过设置相等的不交换来保持稳定。
public void sort(int[] arr) {
for(int i=0;i<arr.length;i++){
for(int j=i;j>0 && arr[j]<arr[j-1];j--){
swap(arr,j,j-1);
}
}
}
在工程中数组长度很短时仍采用插入排序,因为它比较快而且可以保持稳定也可以保持不稳定,所以可以比较基本数据类型也可以比较对象