每天一个数据结构——三种简单排序算法及Java实现

一、选择排序

基本思想:索引左边的是已经排好序的右边是待排序的,每一趟都从待排序的元素中选取最小的元素和该索引位置的元素交换(最小值是自己就和自己交换)。对于长度为N的数组,交换的次数为N,比较的次数大约N*N/2

Java实现:

public class SelectionSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//测试
		int[] b = {18,2,45,36,78,3,1,8};
		sort(b);
		for(int i: b)//遍历
			System.out.print(i + " ");
	}
	public static void sort(int[] a) {
		int N = a.length;
		for(int i = 0; i < N; i++) {
			//每次外循环排定一个值
			//将初始下标值作为最小值
			int min = i;
			//找出最小值下标
			for(int j = i+1; j < N; j++) {
				if(a[j]<a[min]) 
					min = j;
			}
			//将最小值和i索引处值交换
			exch(a, i,min);
		}
	}
	
	public static void exch(int[] a, int i , int j) {
		int t = a[i];
		a[i] = a[j];
		a[j] = t;
	}
}

输出结果:

1 2 3 8 18 36 45 78

二、插入排序

基本思想:也是左边的元素都是有序的,但是插入排序不会访问索引右边的元素,第i个之前的都是有序的,将第i个和之前的一个元素比较,小于就交换接着再逐一比较。

Java实现:

public class InsertionSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] b = {18,2,45,36,78,3,1,8};
		sort(b);
		for(int i: b)//遍历
			System.out.print(i + " ");
	}
	public static void sort(int[] a) {
		int N = a.length;
		for(int i = 1; i<N ; i++) {
			for(int j = i; j > 0; j--) {
				if(a[j]<a[j-1]) {
					int t = a[j - 1];
					a[j -1] = a[j];
					a[j] = t;
				}
			}
		}
	}

}
输出结果:
1 2 3 8 18 36 45 78

三、希尔排序

基本思想:希尔排序,基于插入排序。先将待排序序列的数组元素分为多个子序列,使每个子序列元素相对较少然后对各个子序列进行直接插入排序,然后缩小间隔直至为1。

Java实现:

public class ShellSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] b = {18,2,45,36,78,3,1,8};
		sort(b);
		for(int i: b)//遍历
			System.out.print(i + " ");
	}
	public static void sort(int[] a) {
		int N = a.length;
		int h = 1;
		while(h<N/3) h = 3*h + 1;  //1,4,13,40......
		while(h>=1) {
			//将数组变为h有序
			for(int i = h; i < N; i++) {
				for(int j=i; j>=h; j-=h) //小于h不能再减了
					if(a[j]<a[j-h]) {
						int t = a[j-h];
						a[j-h] = a[j];
						a[j] = t;
					}
			}
			h = h/3;
		}
	}
}

输出结果:

1 2 3 8 18 36 45 78

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值