/*
* 选择排序,每次从数组中选择一个最小的插入到有序部分,
* 数组可分为两部分,前面的有序部分,后面乱序
* 时间复杂度O(n*n)
* 不稳定的排序算法。
*/
public class SelectSort {
static void selectSort(int a[]){
for(int i=0;i<a.length-1;i++){ //每次循环只进行一次交换,最多进行len-1次交换
int nindex=i;//nindex记录有序与无序的分界线
for(int j=i+1;j<a.length;j++)
if (a[j]<a[nindex]){
nindex=j;
}
if(nindex!=i){
int temp=a[i];
a[i]=a[nindex];
a[nindex]=temp;
}
}
}
/*
* i=0时,是将最大的数放到第一个位置,剩下要排的数就是a.length-1
* i=1时,将第二大数放到第二个位置,剩下要排的数就是a.length-2
* ...依次类推.
* 时间复杂度O(n*n)
*/
public static void bubbleSort(int a[]){
int i,j;
for(i=0;i<a.length-1;i++){//n个数比较n-1次
for(j=0;j<a.length-i-1;j++){//最后i个元素都排序到正确的位置上了
if(a[i]<a[j]){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
public static void bubbleSortOptimized(int a[]){//冒泡排序的优化实现
//若数组部分有序,可以减少交换的次数
int i,j;
boolean swap;
for(i=0;i<a.length-1;i++){
swap=false;
for(j=0;j<a.length-i-1;j++){
if(a[i]<a[j]){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
swap=true;
}
}
if(swap==false)
break;
}
}
public static void printArr(int a[]){
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
System.out.println();
}
public static void main(String[] args){
int a[]={-1,5,0,3,10,2,1};
int b[]={4, 34, 25, 12, 22, 11, 90};
selectSort(a);
printArr(a);
long start = System.currentTimeMillis();
bubbleSort(b);
printArr(b);
long end = System.currentTimeMillis();
System.out.println("bubbleSort need "+(end-start)+"ms.");
long start2 = System.currentTimeMillis();
bubbleSortOptimized(a);
printArr(b);
long end2 = System.currentTimeMillis();
System.out.println("bubbleSortOptimized need "+(end2-start2)+"ms.");
}
}
选择排序与冒泡排序
最新推荐文章于 2023-12-22 19:14:44 发布