两种交换排序代码实现(冒泡排序+快速排序【可多种方式优化】)

交换排序

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");

	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值