选择、冒泡、插入排序法

算法原理及代码实现

一、选择排序算法的原理

选择排序简单的来说就是拿第一个数和剩下的数去比较,找出最小的数之后和第一个数交换,以此类推进行n-1次的比较得到一个新的排序方法。
下面展示一些 内联代码片

//选择排序法
package arraylist;

public class SeletionSort {

	//首先定义一个整体的框架,能够打印出来数值
	//2.找出最小的值的位置
	//3.交换位置
	//4.进行整体的排序,多加入一个循环,进行变化选择排序
	//5.优化算法:将重复的代码设置为一个方法.打印和交换
	
	public static void main(String[] args) {
		int[] arr= {5,6,8,3,9,7,2,4};
		
		for(int i=0;i<arr.length-1;i++) {//保证i+1后面有位置
			int minPos=i;
		
			for(int j=i+1;j<arr.length;j++) {
//				if(arr[j]<arr[minPos])
//					minPos=j;	
				minPos=arr[j]<arr[minPos]? j:minPos;
			}
		swap(arr,i,minPos);
//		int temp=arr[i];
//		arr[i]=arr[minPos];
//		arr[minPos]=temp;
		System.out.println("经过第"+i+"次");
	
//		for(int i1=0;i1<arr.length;i1++) {
//			System.out.print(arr[i1]+"  ");
//		}
		print(arr);
		System.out.println("minPos:"+minPos+"  数值为"+arr[minPos]);
	
		}
		
		print(arr);
	}
	
	static void swap(int[] arr,int i,int j) {
		int temp=arr[i];
		arr[i]=arr[j];
		arr[j]=temp;	
		
		}
		
		
		
	static void print(int[] arr) {
		for(int i1=0;i1<arr.length;i1++) {
			System.out.print(arr[i1]+"  ");
		}
		
	}		 	
}

选择排序经历了里外两次For循环,时间复杂度为***O(n^2)***,算法是不稳定的,大佬可以列举出不稳定的例子?

二、冒泡排序算法的原理

冒泡排序简单的来说就是相邻两个数进行比较,将较大的数向后排列,以此类推进行n-1次的比较得到一个新的排序方法,与选择排序不同的是冒泡排序是从后向前,由大而小排列的,选择排序是从小向大进行排序的。
下面展示一些 冒泡代码片

//冒泡排序法
public class BubbleSort {
	public static void main(String[] args) {
	int[] arr= {5,6,8,3,9,7,2,4};
	for(int j=0;j<arr.length-1;j++) {	//for(int j=arr.length-1;j>0;j--)
		for(int i=0;i<arr.length-1-j;i++) {
			if(arr[i]>arr[i+1]) {
				swap(arr,i,i+1);
			}
		}
		
	}
	print(arr);
	}
	static void swap(int[] arr,int i,int j) {
		int temp=arr[i];
		arr[i]=arr[j];
		arr[j]=temp;	
		
	}	
	static void print(int[] arr) {
		for(int i1=0;i1<arr.length;i1++) {
			System.out.print(arr[i1]+"  ");
		}
		
	}            	
}

冒泡排序的时间复杂度为***O(n^2)***,算法是比选择排序稳定的。

三、插入排序算法的原理

插入排序比较重要,对于基本有序的数组最好用,简单的来说就是拿中间的数一直和前面的数进行比较,个子小的就往前面站,大的靠后站。相当于我们在整齐的队伍中插入一个重新排列,每进行一次前面的队伍都是整齐的,随后将后面的数插入一个进行比较归位。
下面展示一些 插入排序代码片

//插入排序法
package arraylist;

public class InsertSort {

	public static void main(String[] args) {
		int[] arr= {6,5,8,3,9,7,2,4};
		
		for(int j=1;j<arr.length;j++) {
			for(int i=j;i>0;i--) {
				if(arr[i]<arr[i-1])
					swap(arr,i,i-1);
			}
		}		
		print(arr);
		
	}	
		static void swap(int[] arr,int i,int j) {
			int temp=arr[i];
			arr[i]=arr[j];
			arr[j]=temp;	
			
		}	
		static void print(int[] arr) {
			for(int i1=0;i1<arr.length;i1++) {
				System.out.print(arr[i1]+"  ");
			}
			
		}        
}

插入排序的时间复杂度为循环套循环,所以时间复杂度也为***O(n^2)***,但算法是比选择和冒泡排序计算量小。

四、简单总结选择、冒泡、插入排序算法

选择排序算法:基本不用,不稳定;
冒泡排序算法:两两比较太慢,基本不用;
插入排序算法:样本小且基本有序的时候效率比较高。基本有序就减少交换次数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值