面试中经常问的三种简单排序方法

/**
 * 三种简单的排序
 * 本类中所有举例都是按照从小到大进行排序
 * @author caohaicheng
 * @time   2014-07-24
 */
public class SortDemo {
	//int[] score={7,10,35,21,78,2,1,9};
	public static void main(String[] args) {
		SortDemo sd=new SortDemo();
		System.out.println("*********************************冒泡排序**********************************");
		//冒泡排序
		sd.BubbleSort();
		
		System.out.println("*********************************选择排序**********************************");
		//选择排序
		sd.selectSort();
		
		System.out.println("*********************************插入排序**********************************");
		//插入排序
		sd.insertSort();
	}
	
	/**
	 * 冒泡排序:循环进行相邻的两个数比较,然后根据规则决定是否调换位置
	 */
	private  void BubbleSort() {
		int[] score={7,10,35,21,78,2,1,9};	
		for(int i=1;i<score.length;i++){	//最多比较N-1次,每比较一轮就将所参与比较的数的最大值蠕动到这些数的最后面
			/*
			 * 第二次循环的j很关键,因为当第一轮比较结束,数组中的最大的那个值已经被放到最后一位了
			 * 第二轮的时候就不需要最后一个数字参与比较了,比较结束倒数第二大的数放在倒数第二的位置了
			 * 依次类推 ,最多比较N-1次就可以全部排序好。
			 */
			for(int j=0;j<score.length-i;j++){
				if(score[j]>score[j+1]){
					//两个元素互换位置
					int temp=score[j];
					score[j]=score[j+1];
					score[j+1]=temp;
				}
			}
			System.out.print("冒泡排序第"+i+"次排序结果:");
			for(int k=0;k<score.length;k++){
				System.out.print(score[k]+"\t");
			}
			System.out.println();
		}
		System.out.print("冒泡排序最终排序的结果:");
		for(int i=0;i<score.length;i++){
			System.out.print(score[i]+"\t");
		}
		System.out.println();
	}
	
	/**
	 * 选择排序:顺序依次取出一个数与它后面的所有数进行比较,找出最小的然后交换位置
	 * 冒泡排序是跟相邻的两两比较,发现比他小就交换位置; 而选择排序是跟所有的都比较之后,确定了哪个最小,再交换位置
	 * 
	 */
	private void selectSort(){
		int[] score={7,10,35,21,78,2,1,9};
		for(int i=0;i<score.length-1;i++){//没循环依次就找到了一个最小值,最多循环N-1次
			int minIndex=i;
			for(int j=i+1;j<score.length;j++){//跟后面的所有数进行比较,找出那个最小的
				if(score[minIndex]>score[j]){
					minIndex=j;//找到最小值的下标了
				}
			}
			
			//交换位置
			int temp=score[minIndex];
			score[minIndex]=score[i];
			score[i]=temp;
			
			System.out.print("选择排序第"+i+"次排序结果:");
			for(int k=0;k<score.length;k++){
				System.out.print(score[k]+"\t");
			}
			System.out.println();
			
		}
		System.out.print("选择排序最终排序的结果:");
		for(int i=0;i<score.length;i++){
			System.out.print(score[i]+"\t");
		}
		System.out.println();
	}
	
	/**
	 * 插入排序:跟玩扑克牌的时候抓牌"码牌"类似,我们抓第一张牌不用排序,第二张牌要与第一张牌进行比较,如果小于第一张牌,那么就
	 * 将第一张牌移动到第2的位置上
	 * 以后依次抓牌,与手牌从前往后依次比较,当发现小于某张手牌的时候就将抓到的牌放在该位置,该位置后的牌依次后移。
	 * 
	 */
	private void insertSort(){
		int[] score={7,10,35,21,78,2,1,9};
		for(int i=1;i<score.length;i++){
			int temp=score[i];
			int j=i-1;
			while(j>=0 && score[j]>temp ){
				score[j+1]=score[j];
				j--;
			}
			score[j+1]=temp;
		}
		System.out.print("插入排序最终排序的结果:");
		for(int i=0;i<score.length;i++){
			System.out.print(score[i]+"\t");
		}
		System.out.println();
	}  
	
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值