排序法
import java.util.Scanner;
public class Text10_3 {
public static void main(String[] args) {
final int n = 5;//定义不可变常量n//c中的#define
Scanner Sr = new Scanner(System.in);
System.out.println("输入"+n+"个数字");
System.out.println("冒泡排序法:");
System.out.println("从大到小:");
int a[] = new int [n];
int i,j,k,min,t;
for (i = 0;i < a.length;i ++) {
a[i] = Sr.nextInt();
}
for(i = 0;i < a.length;i ++)
for(j = i+1;j <a.length;j ++) {
if(a[i]<a[j]) {
k = a[i];
a[i] = a[j];
a[j] = k;
}
}
for(i = 0;i <a.length;i ++) {
System.out.print(a[i] + " ");
}
System.out.println("\n"+"选择排序法:");
System.out.println("从小到大:");
for(i = 0;i < a.length-1;i ++) {
min = i;
for(j = i+1;j < a.length;j ++) {
if(a[j] < a[min])
{min = j;}
t = a[i];
a[i] = a[min];
a[min] = t;
}
}
for(i = 0;i <a.length;i ++) {
System.out.print(a[i] + " ");
}
}
}
冒泡排序法是两两依次比较,并做交换,交换的次数多。
选择排序法是每次循环找出最值,循环结束后将最值调整到合适位置,交换的次数少。
时间复杂度
冒泡排序法最优的情况也就是已经排序好序,不用交换元素,时间花销为:[ n(n-1) ] / 2;所以最优的情况时间复杂度为:O( n^2 );选择一样
最差的情况也就是开始的时候元素是逆序的,那么每一次排序都要交换两个元素,则时间花销为:[ 3n(n-1) ] / 2;(其中比上面最优的情况所花的时间就是在于交换元素的三个步骤);所以最差的情况下时间复杂度为:O( n^2 );选择一样
冒泡:
最优的时间复杂度为:O( n^2 ) ;也可能是O(n),见下面分析
最差的时间复杂度为:O( n^2 );
平均的时间复杂度为:O( n^2 );
for(i =a.length;i > 0;i --,m = 1){
for(j = 0;j < i;j ++){
if(a[j] < a[j+1]){
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
m = 0;//如果乱序,m = 0;如果已经排好序,不会交换,m依然等于1;
}
}
if(m)//如果m存在,即m == 1
break;//打破循环
}
空间复杂度为0;