title: (2)交换排序之冒泡排序 date: 2019-02-10 13:00:00 +0800 update: 2019-02-10 13:00:00 +0800 author: me cover: http://ww1.sinaimg.cn/large/006jIRTegy1fzwiafdswej31jk0v9qp2.jpg preview: 冒泡排序是非常好理解的,以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后。 tags:
平均: O(n^2)
最好: O(n)
最差: O(n^2)
O(1)
稳定
class BubbleSortClass{
public static void main(String[] args) {
System.out.println("冒泡排序-没有优化的");
int[] arr = {1,1,2,0,9,3,12,7,8,3,4,65,22};
System.out.println("原数组");
for(int i:arr){
System.out.print(i+",");
}
BubbleSortClass.BubbleSort(arr);
System.out.printf("\n排序后的\n");
for(int i:arr){
System.out.print(i+",");
}
}
public static void BubbleSort(int[] arr){
int i ,j;
int n=arr.length;
for(i=0;i<n-1;i++){
for(j=1;j<n-i;j++){
if(arr[j-1]>arr[j]){
int temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
}
}
}
}
}
如果对于一个本身有序的序列,或则序列后面一大部分都是有序的序列,上面的算法就会浪费很多的时间开销,这里设置一个标志flag,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。
class BubbleSortClass{
public static void main(String[] args) {
System.out.println("冒泡排序-没有优化的");
int[] arr = {1,1,2,0,9,3,12,7,8,3,4,65,22};
System.out.println("原数组");
for(int i:arr){
System.out.print(i+",");
}
BubbleSortClass.BubbleSort(arr);
System.out.printf("\n排序后的\n");
for(int i:arr){
System.out.print(i+",");
}
}
public static void BubbleSort(int[] arr){
int i ,j;
int n=arr.length;
//设置标志
boolean flag = true;
while(flag){
//进来先设置为false
flag = false;
for(j=1;j<n;j++){
if(arr[j-1]>arr[j]){
int temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
//如果数据进行交换,证明仍需要进行排序
flag=true;
}
}
//一次排序后,已经确定一位
n--;
}
}
}
现在有一个包含1000个数的数组,仅前面100个无序,后面900个都已排好序且都大于前面100个数字
class BubbleSortClass{
public static void main(String[] args) {
System.out.println("冒泡排序-没有优化的");
int[] arr = {1,1,2,0,9,3,12,7,8,3,4,65,22};
System.out.println("原数组");
for(int i:arr){
System.out.print(i+",");
}
BubbleSortClass.BubbleSort(arr);
System.out.printf("\n排序后的\n");
for(int i:arr){
System.out.print(i+",");
}
}
public static void BubbleSort(int[] arr){
int i ,j;
int n=arr.length;
//需要排序的边界,刚开始为n
int border = n;
//border=0 可以不用排序
while(border>0){
//边界后的已经是有序的
n=border;
border = 0;
for(j=1;j<n;j++){
if(arr[j-1]>arr[j]){
int temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
//如果数据进行交换,证明仍需要进行排序,将边界设置为j
border=j;
}
}
}
}
}