常见排序算法总结

选择排序、冒泡排序、插入排序、归并排序总结

先上代码

选择排序

选择排序每次从数组中找出最小的数和首位进行交换,依次进行直到只剩最后一位
因此外层for循代表需要从a[0]开始找a.length-1次最小值(最后一位不需要找肯定是最小)
内层for循环代表从第i位开始到a.length-1找最小值

public class test {
	
	public static void main(String[] args) {
		int a[] = new int[(int)(Math.random()*20+1)];
		 for(int i = 0; i<a.length; i++){
			 a[i]=(int) (Math.random()*100);
			
		 }
	     sort(a);
	     for(int i = 0; i<a.length ;i++){
	    	 System.out.println(a[i]);
	     }
	}
	 
   public static void sort(int a[]){
	   if(a.length == 0 || a.length < 2)
		   return;
	   int min , t;
	   for(int i = 0; i < a.length-1; i++){
		   min = i;
		   for(int q = i ;q < a.length; q++){
			   if(a[q] < a[min]){
				  min = q;
			   }
		   }
		   if(min != i){
			   t = a[i];
			   a[i] = a[min];
			   a[min] = t;
		   }
	   }
   }
}

冒泡排序

冒泡排序和选择排序的不同之处就在于冒泡排序每次的比较过程都进行交换而不是和选择排序一样只记录当前这趟查找的最小值

public class test {
	
	public static void main(String[] args) {
		int a[] = new int[(int)(Math.random()*20+1)];
		 for(int i = 0; i<a.length; i++){
			 a[i]=(int) (Math.random()*100);
			
		 }
	     sort(a);
	     for(int i = 0; i<a.length ;i++){
	    	 System.out.println(a[i]);
	     }
	}
	 
   public static void sort(int a[]){
	   if(a.length == 0 || a.length < 2)
		   return;
	   int t = 0;
	   for(int i = a.length-1; i > 0; i--){
		   for(int q = 0 ;q < i; q++){
			   if(a[q] > a[q+1]){
				   t = a[q];
				   a[q] = a[q+1];
				   a[q+1] = t;
			   }
		   }
	   }
   }
}

插入排序

public class test {
	
	public static void main(String[] args) {
		int a[] = new int[(int)(Math.random()*20+1)];
		 for(int i = 0; i<a.length; i++){
			 a[i]=(int) (Math.random()*100);
			
		 }
	     sort(a);
	     for(int i = 0; i<a.length ;i++){
	    	 System.out.println(a[i]);
	     }
	}
	 
   public static void sort(int a[]){
	   if(a.length == 0 || a.length < 2)
		   return;
	   int min , t;
	   for(int i = 1; i < a.length; i++){
		  for(int q = i; q > 0; q--){
			  if(a[q]<a[q-1]){
				  t=a[q];
				  a[q]=a[q-1];
				  a[q-1]=t;
			  }
		  }
	   }
   }
}

归并排序

归并排序运用了分治的思想,通过二分、合并来排序。归并排序之所以可以比前三种排序更快,是因为它避免了不必要的比较与交换,每次合并时不再需要排序只需要比较两个已经排好序的数组即可。因此归并排序的时间复杂度为O(N*logN)。

public class test {
	
	public static void main(String[] args) throws UnknownHostException {
		int a[] = new int[(int)(Math.random()*20+1)];
		 for(int i = 0; i<a.length; i++){
			 a[i]=(int) (Math.random()*100);
			
		 }
	     sort(a,0,a.length-1);
	     for(int i = 0; i<a.length ;i++){
	    	 System.out.println(a[i]);
	     }
	}
	 
   public static void sort(int a[],int l,int r){
	   if(l == r)
		   return ;
	   int mid = (l+r)/2;
	   sort(a,l,mid);
	   sort(a,mid+1,r);
	   merge(a,l,mid,r);  //合并数据
   }
   
   public static void merge(int a[],int l,int mid,int r){
	   int help[] = new int [r-l+1];	//用于暂时保存合并数据
	   int p1 = l,p2 = mid+1;
	   int i = 0;
	   int sum = 0;
	   while(p1 <= mid&& p2 <= r){
		   help[i++] = a[p1]<a[p2] ? a[p1++] : a[p2++];  
	   }
	   while(p1 <= mid){		//将剩余元素直接拷贝给help
		   help[i++] = a[p1++];
	   }
	   while(p2 <= r){
		   help[i++] = a[p2++];
	   }
	   for(int q = 0; q<help.length; q++){
		   a[q+l] = help[q];
	   }
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值