javaSE基础知识总结-排序算法

以下列举的排序算法是数据结构学的那十种,用java实现,慢慢更新,一次学完还会忘。
但是java自身是有排序函数的,用起来更方便哦。

Array.sort(array);
System.out.println("Arrays.toString(array)");//按从小到大以字符串形式输出数组

另外Collection.reverse可以从大到小输出list,这个还不太了解。

冒泡排序

最简单。
相邻两个元素比较,并进行交换,将最大/最小移至结尾,再进行下一轮比较。

	public static void main(String[] args) {
		//冒泡排序法(从小到大)
		int[] a= {5,7,4,6,3,2,1,8,9,0};
		for(int i=0;i<a.length;i++) System.out.print(a[i]);
		for(int i=0;i<a.length;i++) {
			for(int j=0;j<a.length-1-i;j++) {
				if(a[j]>a[j+1]) {
					int t=a[j];
					a[j]=a[j+1];
					a[j+1]=t;
				}
			}
		}
		System.out.println("\n输出排好序的数组:");
		for(int i=0;i<a.length;i++) System.out.print(a[i]);
	}
}

选择排序

每次从余下的元素中选出一个最大的,并与指定位置的元素进行交换。
也很简单。

public class lianxi2 {

	public static void main(String[] args) {
		//选择排序 从小到大
		int[] a= {5,7,4,6,3,2,1,8,9,0};
		for(int i=0;i<a.length;i++) System.out.print(a[i]);

		int min=0;
		for(int i=0;i<a.length-1;i++) {
			min=i;
			for(int j=i+1;j<a.length;j++) {
				if(a[j]<a[min]) {
					min=j;
				}
			}
			int t=a[i];
			a[i]=a[min];
			a[min]=t;
		}
		
		System.out.println("\n输出排好序的数组:");
		for(int i=0;i<a.length;i++) System.out.print(a[i]);
	}
}

插入排序

将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

public class lianxi3 {

	public static void main(String[] args) {
		//插入排序 从小到大
		int[] a= {5,7,4,6,3,2,1,8,9,0};
		for(int i=0;i<a.length;i++) System.out.print(a[i]);
		
		for(int i=1;i<a.length;i++) {
			int preindex=i-1;
			int current=a[i];
			while(preindex>=0&&a[preindex]>current) {
				a[preindex+1]=a[preindex];
				preindex--;
			}
			a[preindex+1]=current;
		}
		
		
		System.out.println("\n输出排好序的数组:");
		for(int i=0;i<a.length;i++) System.out.print(a[i]);

	}
}

希尔排序

基于插入排序的一种优化排序算法。
由于以下两个原因:

  1. 直接插入排序在基本有序时,效率较高;
  2. 在待排序的记录个数较少时,效率较高

因此我们采用希尔算法对插入排序进行改进,将待排序数组按适当的增量分组,先对每组进行插入排序,最后再对几乎以经排好序的数组进行排序。

  • 举例:待排序数组为9,1,0,2,3,8,7,4,5,6
    设第一趟增量为3
    第一趟第一组:9,2,7,6
    排好为:2,6,7,9
    第一趟第二组:1,3,4
    排好为:1,3,4
    第一趟第三组:0,8,5
    排好为:0,5,8
    第一趟结束:2,1,0,6,3,5,7,4,8,9
    设第二趟增量为1
    第二趟结束:0,1,2,3,4,5,6,7,8,9
  • 代码实现如下:
public class lianxi4 {

	public static void main(String[] args) {
		//希尔排序,从小到大
		int[] a= {9,1,0,2,3,8,7,4,5,6};
		int gap=1;
		while(gap<a.length/3){
		    gap=gap*3+1;
		}//先选择增量大小
		while(gap>0) {
		     for(int i=gap;i<a.length;i++) {
		        int temp=a[i];
		        int j=i-gap;
		        while(j>=0&&a[j]>temp) {
		        	a[j+gap]=a[j];
		        	j-=gap;
		        }
		        a[j+gap]=temp;
		      }
		 gap=(int)Math.floor(gap/3);
		}
		System.out.println("输出排序后的数组:");
		  for(int i:a){
			  System.out.print(i+"\t");
		}		        
	}
}

注:
1. 是一种不稳定的排序方法。
2. 如何选择最佳增量,目前尚未解决。
3. 最后一个增量值必须为1,无除1以外的公因子,
4. 不适宜在链式储存结构下实现

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值