用Java实现常用算法

创建一个普通的Java类就可以去验证算法是否有效了,数组如果你看着不是很明显的话,你可以换一下里面的元素。

关于排序算法的稳定性,可以参考:http://blog.csdn.net/qq_33499573/article/details/72772307 下的文档。

冒泡排序:
      依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最大数。如此下去,直至最终完成排序。
	//冒泡排序
	@Test
	public void bubbleSort() {
		int numbers[] = {78,5,98,45,36,15,24,2,3,21,11};
	    int temp; // 记录临时中间值   
	    int size = numbers.length; // 数组大小   
	    for (int i = 0; i < size - 1; i++) {   
	        for (int j = i + 1; j < size; j++) {   
	            if (numbers[i] < numbers[j]) { //交换两数的位置   
	                temp = numbers[i];   
	                numbers[i] = numbers[j];   
	                numbers[j] = temp;   
	            }   
	        } 
	    }
	    for(int i=0;i<size;i++){  
		       System.out.println(numbers[i]);  
		    }
	}


选择排序:
       它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
	//选择排序
	public void SelectSort() {
		int numbers[] = {11,2,87,54,25,32,4,69,10,52};
	    int size = numbers.length, temp;
	    for (int i = 0; i < size; i++) {
	        int k = i;
	        for (int j = size - 1; j >i; j--)  {
	            if (numbers[j] < numbers[k])  k = j;
	        }
	        temp = numbers[i];
	        numbers[i] = numbers[k];
	        numbers[k] = temp;
	    }
	    for(int i=0;i<size;i++){  
		       System.out.println(numbers[i]);  
		    }
	}
插入排序
每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
//插入排序
	public void insertSort() {
		int numbers[] = {45,1,86,2,52,45,24,35,65,25};
	    int size = numbers.length, temp, j;   
	    for(int i=1; i<size; i++) {   
	        temp = numbers[i];   
	        for(j = i; j > 0 && temp < numbers[j-1]; j--)   
	            numbers[j] = numbers[j-1];   
	        numbers[j] = temp;   
	    }
	    
	    for(int i=0;i<size;i++){  
		       System.out.println(numbers[i]);  
		    }
	} 
直接插入排序
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
//直接插入排序
	public void InsertSort(){  
	    int a[]={49,38,65,97,76,13,27,49,12,64,5,4,62,99,35,25,51};  
	    int temp=0;  
	    for(int i=1;i<a.length;i++){  
	       int j=i-1;  
	       temp=a[i];  
	       for(;j>=0&&temp<a[j];j--){  
	           a[j+1]=a[j];  //将大于temp的值整体后移一个单位  
	       }
	       a[j+1]=temp;  
	    }  
	  
	    for(int i=0;i<a.length;i++){  
	       System.out.println(a[i]);  
	    }
	}
希尔排序
希尔排序(Shell Sort)是 插入排序的一种。也称缩小 增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
	//希尔排序 
	public void shellSort(){
		int a[]={1,54,6,3,78,34,12,45,56,100};  
		double d1=a.length;  
		int temp=0;
		while(true){
			d1= Math.ceil(d1/2);
			int d=(int) d1;
			for(int x=0;x<d;x++){
				for(int i=x+d;i<a.length;i+=d){
					int j=i-d;
					temp=a[i];
					for(;j>=0&&temp<a[j];j-=d){
						a[j+d]=a[j];  
					}  
					a[j+d]=temp;  
				}  
			}  
			if(d==1){  
				break;  
			}  

			for(int i=0;i<a.length;i++){  
				System.out.println(a[i]);  
			}  
		} 
	}
简单选择排序
设所排序序列的记录个数为n。i取1,2,…,n-1,从所有n-i+1个记录(Ri,Ri+1,…,Rn)中找出排序码最小的记录,与第i个记录交换。执行n-1趟 后就完成了记录序列的排序。
简单选择排序算法原理:每次从左至右扫描序列,记下最小值的位置。
简单选择排序是不稳定排序。
	//简单选择排序
	public void selectSort(){  
		int a[]={1,54,6,3,78,34,12,45};  
		int position=0;  
		for(int i=0;i<a.length;i++){
			int j=i+1;  
			position=i;  
			int temp=a[i];  
			for(;j<a.length;j++){  
				if(a[j]<temp){
					temp=a[j];
					position=j;
				}  
			}  
			a[position]=a[i];  
			a[i]=temp;
		}
		for(int i=0;i<a.length;i++)  
		System.out.println(a[i]);  
	}  








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值