一.前提
1.为简单起见,讨论从小到大的整数排序
2.只讨论基于比较的排序(< = >有定义)
3.只讨论内部排序
4.稳定性:任意两个相等的数据,排序前后相对位置不发生变化
二.冒泡排序原理
是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,将较大的元素往后放,第一次比较完毕,最大值放在最后,依次这样比较,直到数列没有在需要交换,排序完成。
三.分类
1.相邻两个元素比较 ; 2.不相邻两个元素比较
1.简单冒泡排序
(不相邻的两个元素比较)一次循环以该位置元素与该位置元素之后的所有元素进行比较,最大的放在该位置。(这好像是选择排序,反正只要记住下面那个正宗的冒泡排序就行,就是第二个和第三个)
public int[] Simple_Bubble_Sort(int[] array){
//i为当前数组位置,初始为数组最后一个数
for(int i = array.length-1; i > 0; i--){
//循环比较,把未排序序列中最大的放在该序列的末尾
//总是用未排序序列的末尾元素和未排序序列中的还没有进行过比较的元素进行比较
//初始比较元素为数组最后一位元素
for(int j = 0; j < i; j++){
if(array[i] < array[j]){
int temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
}
return array;
}
2.冒泡排序
(相邻的两个元素比较)一次循环以相邻位置元素之间进行比较,不符合升序则调换。
public int[] Bubble_Sort(int[] array){
//i为当前数组位置,初始为数组最后一个数
for(int i = array.length-1; i > 0; i--){
//循环比较,把未排序序列中最大的放在该序列的末尾
//相邻元素两两比较,从左到右,逐渐把最大的数交换到序列末尾
for(int j = 0; j < i; j++){
if(array[j] > array[j+1]){
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
return array;
}
3.冒泡排序-优化
当整个数组已经是以升序排序时,原始冒泡排序还是会循环比较。这样会导致浪费。所以增加一个flag。初始值为0,每当这一趟循环里执行了交换时置为1
public int[] Bubble_Sort(int[] array){
//i为当前数组位置,初始为数组最后一个数
for(int i = array.length-1; i > 0; i--){
int flag = 0; //增加的语句
for(int j = 0; j < i; j++){
if(array[j] > array[j+1]){
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
flag = 1; //增加的语句
}
}
//执行一次循环后如果flag = 0,表示数组已经排好序,之后不需要再排序了
if(0 == flag) break; //增加的语句
}
return array;
}
四.时间复杂度
1.没有优化的排序:T(n) =O(n2)
2.优化后的排序:
- 最好情况:顺序,顺着数组只比较一次 T(n) = O(n)
- 最坏情况:逆序,每次都要比较 T(n) =O(n2)
五.空间复杂度
所有操作都是在一个数组内进行的,没有额外的添加空间
S(n) = O(1)