排序算法
内层循环控制行
外层循环控制列
1.1冒泡排序
数组a,升序
for(int i=0;i<a.length()-1;i++){ for(int j=0;j<a.length()-i-1;j++){ if(a[j]>a[j+1]){ int temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } }
1.2 选择排序
for(int i=0;i<a.length()-1;i++){ for(int j=i+1;j<a.length();j++){ if(a[i]>a[j]){ int temp=a[i]; a[i]=a[j]; a[j]=temp; } } }
1.3 选择排序的优化
交换次数少!
for(int i=0;i<a.length()-1;i++){ int min=i; for(int j=i+1;j<a.length();j++){ if(a[min]>a[j]){ min=j; } } if(i!=min){ int temp=a[i]; a[i]=a[min]; a[min]=temp; } }
1.4 插入排序
for(int i=0;i<a.length()-1;i++){ for(int j=i+1;j>0;j--){ if(a[j]<a[j-1]){ int temp=a[j]; a[j]=a[j-1]; a[j-1]=temp; }else{ break //优化 } } }
1.5 二分查找
要求对数组a已经排好序public class BinarySearch{ public static int rank(int key,int[] a){ int l=0; int h=a.length()-1; while(l<=h){ //9/2=4 int mid=l+(h-l)/2; if(key<a[mid]){ h=mid-1; }else if(key>a[mid]){ l=mid+1; }else{ return mid; } } return -1; //无所对应的下标 } }
1.6 希尔排序
public static void main(String [] args) { int[]a={49,38,65,97,76,13,27,49,78,34,12,64,1}; System.out.println("排序之前:"); for(int i=0;i<a.length;i++) { System.out.print(a[i]+" "); } //希尔排序 int d=a.length; while(true) { d=d/2; for(int x=0;x<d;x++) { for(int i=x+d;i<a.length;i=i+d) { int temp=a[i]; int j; for(j=i-d;j>=0&&a[j]>temp;j=j-d) { a[j+d]=a[j]; } a[j+d]=temp; } } if(d==1) { break; } } System.out.println(); System.out.println("排序之后:"); for(int i=0;i<a.length;i++) { System.out.print(a[i]+" "); } }