基础排序算法(1)
1.冒泡排序(Bubble Sort)
冒泡排序是一种基础排序算法,通过循环遍历待排序数组,相邻元素两两比较,按升序或降序的方式选择交换。直到没有相邻元素需要交换,该元素数组已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
冒泡排序算法原理:
Step 1: 比较相邻两个元素,如果第一个比第二个大,就交换两个的位置。
Step 2: 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。(假使数组长度为n,第一步我们对相邻元素比较交换,即较大的数往后移一个位)
Step 3: 重复一二步,直到数组有序。(从第一个到第n个有(n-1)对相邻元素,第一次遍历n-1对,然后递减直到第n-1个元素。整个循环共比较了(n-1)!对。)
伪代码实现:
1. unsorted array A[]
2. len <- length(A)
3. for(i =0 ;i<len-1;i++){
for(j = 0;j<len-1-i;j++){//由于后面相邻元素在上一轮已经比较过了,所以j<len-1-i
if(A[j]>A[j+1]){
tmp <- A[j];
A[j] <-A[j+1];
A[j+1]<-tmp;
}
}
}
算法分析:
1.假使数组是正序的,比较次数为n-1,交换次数为0,最好的时间复杂度是O(n)
2.如果数组是反序的,每轮比较次数为(n-i)次,总的比较次数为 ∑(n-i)=n(n-1)/2次,每次比较都必须移动记录三次来达到交换记录位置,所以最坏时间复杂度O(n²).
算法稳定性:
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
java 代码实现:
public class BubbleSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
//生成随机数
Scanner sc = new Scanner(System.in);
System.out.println("请输入生成随机数个数:");
int n = sc.nextInt();
int randNum[] = new int[n];
for(int i=0;i<n;i++) {
int tmp = (int)(Math.random()*10);
randNum[i] = tmp;
System.out.print(randNum[i]+" ");
}
sc.close();
System.out.println(" ");
//冒泡排序
for(int i=0;i<randNum.length-1;i++) {
for(int j=0;j<randNum.length-1-i;j++) {
if(randNum[j]>randNum[j+1]) {
int tmp = randNum[j];
randNum[j] = randNum[j+1];
randNum[j+1] = tmp;
}
}
}
for(int i=0;i<randNum.length;i++) {
System.out.print(randNum[i]+" ");
}
}
// TODO Auto-generated method stub
//生成随机数
Scanner sc = new Scanner(System.in);
System.out.println("请输入生成随机数个数:");
int n = sc.nextInt();
int randNum[] = new int[n];
for(int i=0;i<n;i++) {
int tmp = (int)(Math.random()*10);
randNum[i] = tmp;
System.out.print(randNum[i]+" ");
}
sc.close();
System.out.println(" ");
//冒泡排序
for(int i=0;i<randNum.length-1;i++) {
for(int j=0;j<randNum.length-1-i;j++) {
if(randNum[j]>randNum[j+1]) {
int tmp = randNum[j];
randNum[j] = randNum[j+1];
randNum[j+1] = tmp;
}
}
}
for(int i=0;i<randNum.length;i++) {
System.out.print(randNum[i]+" ");
}
}
}