交换排序
1、冒泡排序
2、快速排序【可多种方式优化】
交换排序
1、冒泡排序
afsaf
package sort; public class BubbleSort { //普通冒泡排序 public static void sortA(int[] arr,int n){ int tmp;//临时变量 int compare=0;//比较趟数 int count=0;//比较次数 int change=0;//交换位置次数 for(int i=0;i<n-1;i++){ compare++; for(int j=n-1;j>i;j--){//冒泡排序,从后往前 count++; if(arr[j-1]>arr[j]){ change++; tmp=arr[j-1]; arr[j-1]=arr[j]; arr[j]=tmp; } } } System.out.println("比较趟数"+compare); System.out.println("比较次数"+count); System.out.println("交换位置次数"+change); } //改进后的冒泡排序 public static void sortMore(int[] arr,int n){ int tmp;//临时变量 int compare=0;//比较趟数 int count=0;//比较次数 int change=0;//交换位置次数 boolean flag=true; for(int i=0;i<n-1;i++){ compare++; flag=false; for(int j=n-1;j>i;j--){//冒泡排序,从后往前 count++; if(arr[j-1]>arr[j]){ change++; tmp=arr[j-1]; arr[j-1]=arr[j]; arr[j]=tmp; flag=true;//某一趟中存在元素的交换,说明未排好序 } } //判断是否还存在比较的情况 if(!flag){//某一趟中不存在元素的交换,说明已经排好序了 break;//结束for循环 } // if(flag==false){ // break;//结束for循环 // } // System.out.println("比较ing.."); } System.out.println("比较趟数"+compare); System.out.println("比较次数"+count); System.out.println("交换位置次数"+change); } public static void main(String[] args) { //普通冒泡排序 int arr[]={4,5,6,3,1,9,0,8,7,2}; sortA(arr,arr.length); System.out.println("排序后:"); for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+" "); } System.out.println("\n------------------------------------------"); //改进后的冒泡排序 int arr2[]={4,5,6,3,1,9,0,8,7,2}; sortMore(arr2,arr2.length); System.out.println("排序后:"); for(int i=0;i<arr2.length;i++){ System.out.print(arr2[i]+" "); } } }2、快速排序【优化】
package sort; //快速排序 public class QuickSort { //交换两个元素的值 public static void swap(int[] arr,int low,int high){ int temp=arr[low]; arr[low]=arr[high]; arr[high]=temp; } //确立基本点+排序 public static int partition(int[] arr,int low,int high){ int point=low;//基本点的值 //目标 基本点 ,左边的值,都比arr[point]小; 右边的值,都比arr[point]大 while(low<high){ //右边扫描,小的值,交换操作 while(low<high && arr[point]<arr[high]){ high--;//从右边开始扫描,过滤比arr[point]大的值,知道遇到比arr[point]小的值 } swap(arr,point,high);//交换元素位置 point=high;//大值位置【point记录--交换后的位置】 //左边扫描,打的值,交换操作 while(low<high && arr[point]>arr[low]){ low++; } swap(arr,low,point);//交换元素位置 point=low;//小值位置【point记录--交换后的位置】 } return point;//【point记录--交换后的位置】 } public static void sort(int[] arr,int low,int high){ if(low<high){//循环终止条件 //确立基本点,进行排序【小于基本点的,放左边,大于基本点的,放右边】 int point=partition(arr,low,high); sort(arr,low,point-1);//左边遍历 // sort(arr,low,point);//左边遍历 sort(arr,point+1,high);//右边遍历 } } public static void main(String[] args) { int i; int a[] = { 5, 2, 6, 0, 3, 9, 1, 7, 4, 8 }; sort(a, 0,a.length-1); System.out.println("快速排序--排序后的结果是:"); for (i = 0; i < 10; i++) { System.out.print(a[i] + " "); } System.out.println("\n"); } }
