排序的含义:
对含有多个记录的文件进行整理,最终使得各个记录按关键字递增( 或递减)的次序排列起来。这个整理的过程称为排序。
- 稳定
- 不稳定

内部排序的分类:
我们讨论的重点是内部排序,而每一种排序方法的实现都依赖于记录在内存的存储结构。



第一轮:
第二轮
第三轮
第四轮
第五轮
package Bioinformatics_code.Sort;
import java.util.Arrays;
public class BubbleSort {
// public static void swap(int a,int b){
// int temp = a;
// a = b;
// b = temp;
// }
public static int[] bubbleSort(int[] sourceArray){
// 对 array 进行拷贝,不改变参数内容
int[] array = Arrays.copyOf(sourceArray, sourceArray.length);
for (int i = 1;i<array.length;i++){
boolean flag = true;
for (int j = 0;j<array.length-i;j++){
if (array[j]>array[j+1]){
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
flag = false;
}
}
if (flag) break;//这一行要放在第一个循环里面,第二个循环外面
}
return array;
}
public static void main(String[] args) throws Exception {
// int a = 1;
// int b = 2;
// swap(a,b);
// System.out.println(a+"+"+b);
int[] array = bubbleSort(new int[]{1,2,3,4,7,42,13,4,67});
System.out.println(Arrays.toString(array));
}
}
package Bioinformatics_code.Sort;
import java.util.Arrays;
import java.util.Scanner;
public class DoubleBubbleSort {
public static void main(String[] args) {
int left;
int right;
int n;
int i = 0;
Scanner scanner1 = new Scanner(System.in);
System.out.print("请输入你要排序的数字个数:");
n = scanner1.nextInt();
int[] array = new int[n];
left = 0;
right = n-1;
Scanner scanner2 = new Scanner(System.in);
System.out.println("请输入你需要排序的数组");
while (scanner2.hasNextLine()){
if (i == n) break;
array[i] = scanner2.nextInt();
i++;
}
System.out.println("未排序前:"+Arrays.toString(array));
while(left < right){
boolean IsSort_1 = true;
for (int j = 0;j < right;j++){
if (array[j] > array[j+1]) {
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
IsSort_1 = false;
}
}
if (IsSort_1) {
break;
}
right--;
boolean IsSort_2 = true;
for (int j = right;j > left;j--){
if (array[j] < array[j-1]) {
int temp = array[j];
array[j] = array[j-1];
array[j-1] = temp;
IsSort_2 = false;
}
}
if (IsSort_2) {
break;
}
left++;
System.out.println("排序中:"+ Arrays.toString(array));
}
System.out.println("最终结果:"+Arrays.toString(array));
}
}
#bubblesort
bubbleSort <- function(array) {
n <- length(array)
lastchange <- 1
sortBorder <- n - 1
for (i in 1:(n - 1)) {
isSort <- TRUE
for (j in 1:sortBorder) {
if (array[j] > array[j + 1]) {
temp <- array[j]
array[j] <- array[j + 1]
array[j + 1] <- temp
isSort <- FALSE
lastchange <- j
}
}
sortBorder <- lastchange;
if (isSort == TRUE) {
break;
}
print(sortBorder)
print(array)
}
return(array)
}
比较次数:Cmax=n(n-1)/2=O(nn)
移动次数:3Cmax=O(nn)
所以:
冒泡排序的最坏时间复杂度为O(n*n)
平均时间复杂度为O(n*n)
冒泡排序是稳定的
疑问:
最后一轮排序时,整个序列已经是有序的了,是排序算法仍然兢兢业业的继续执行了后面的排序。
如果能判断出数列有序,并作出标记,那么剩下的几轮排序就不必执行了。
第一轮
第二轮
第三轮
第四轮
第五轮
如果某轮排序中没有发生交换操作,说明整个队伍已经有序。
算法操作:引用一个布尔量isSort判断是否发生了交换:每趟排序前先将它置为ture,排序过程中若有交换,则isSort置为true。当一趟排序结束时,我们再检查isSort,若仍为ture便终止算法。

其实右边已经是有序的了,可是每一轮还白白比较了很多次。
在每趟扫描中,记录最后一次交换发生的位置k,因为该位置以前的相邻记录都已排了序,所以下一趟扫描终止于k,而不必进行到预定的下界i。
#bubblesort
bubbleSort3 <- function(arrayy) {
n <- length(arrayy)
lastchange <- 1
sortBorder <- n - 1
for (i in 1:(n - 1)) {
isSort <- TRUE
for (j in 1:sortBorder) {
if (arrayy[j] > arrayy[j + 1]) {
temp <- arrayy[j]
arrayy[j] <- arrayy[j + 1]
arrayy[j + 1] <- temp
isSort <- FALSE
lastchange <- j
}
#print(arrayy)
}
sortBorder <- lastchange;
if (isSort == TRUE) {
break;
}
print(sortBorder)
print(arrayy)
}
return(arrayy)
}
后面会继续更新其他排序,本文中大部分代码是我自己写的,可能有需要改进的地方,
希望能帮到你