简单的排序--冒泡、选择、插入

版权声明:尊重博主原创文章,转载请注明出处

引言

对数据进行排序是经常需要做的事情,下面介绍三种简单的排序。这三个算法都包含如下步骤,这两步循环执行,直到数据全部有序为止:

1.比较两个数据项。

2.交换两个数据项,或复制其中一项。

但是,每种算法具体实现的细节有所不同。每个方法都是一个排序算法。

/**
 * @Description	Sort 简单排序算法  时间复杂度都是O(n²) 
 * @Author 		weihuiming
 * @Date		2017年4月6日 下午12:57:26
 */
public class Sort {

	/*
	 * 排序的数组
	 */
	private long[] num;
	
	/*
	 * 数组中的个数
	 */
	private int size;
	
	/**
	 * @Description 冒泡排序	时间复杂度 O(n²) 比较次数 O(n²) 交换次数O(n²) 
	 * @Author 		weihuiming
	 * @Date		2017年4月6日下午1:16:39
	 */
	public void bubbleSort(){
		// out右边的所有数据都是有序的	具有(不变性) 在算法运行过程中这个条件始终为真
		for (int out = size - 1; out > 0; out--) {
			// 对数组进行循环比较
			for (int i = 0; i < out; i++) {
				// 如果前面的数大于后面的数 进行位置交换
				if (num[i] > num[i+1]) {
					swap(i, i+1);
				}
			}
		}
	}
	
	/**
	 * @Description 选择排序	时间复杂度 O(n²) 比较次数 O(n²) 交换次数O(n) 
	 * @Author 		weihuiming
	 * @Date		2017年4月6日下午1:34:14
	 */
	public void selectionSort(){
		// 最小值记录
		int min;
		// 下标小于或者等于out位置上的所有数据都是有序的	具有(不变性) 在算法运行过程中这个条件始终为真
		for (int out = 0; out < size - 1; out++) {
			// 获取第out下坐标
			min = out;
			// 从out后一位开始比较
			for (int in = out + 1; in < size; in++) {
				// 如果比较的数小于最小数
				if (num[in] < num[min]) {
					// 重新获取最小数的位置
					min = in;
				}
			// 把最小数和out上的进行交换
			swap(out, min);
			}
		}
	}
	
	/**
	 * @Description 插入排序	无序的:时间复杂度 O(n²) 比较次数 O(n²) 交换次数O(n) 
	 * 				基本有序的: 时间复杂度 O(n) 比较次数 O(n²) 交换次数O(n) 
	 * @Author 		weihuiming
	 * @Date		2017年4月6日下午2:07:16
	 */
	public void insertionSort(){
		// 每次循环结束,再将temp数据插入后,比out位置小的数据都是局部有效的	具有(不变性) 在算法运行过程中这个条件始终为真
		for (int out = 1; out < size; out++) {
			// 记录要比较的数
			long temp = num[out];
			// 记录位置
			int in = out;
			// 当前位置必须大于0,并且 当前位置前一位数必须大于或者等于 要比较的数 
			while (in > 0 && num[in - 1] >= temp) {
				// 把当前位置和当前位置的前一位进行交换
				num[in] = num[in - 1];
				// 减去当前位置 继续进行判断
				--in;
			}
			// 把要比较的数放到合适的位置
			num[in] = temp;
		}
	}  
	
	/**
	 * @Description 对两个数进行交换
	 * @Author 		weihuiming
	 * @Date		2017年4月6日下午1:14:42
	 * @param one	第一个数的下坐标
	 * @param two	第二个数的下坐标
	 */
	private void swap(int one, int two) {
		long temp = num[one];
		num[one] = num[two];
		num[two] = temp;
	}
}

算法之间的简单比较

冒泡算法:过于简单,可以毫不费力的写出来。当数据量很小的时候会有他的应用价值。
选择排序:把交换次数降到最低,比较次数仍然很大。当数据量很小,并且交换数据相对于比较数据更加耗时的
情况下,可以选择应用。( 目前不知道很小是什么 意思)
插入排序:在大多数情况下,假设当前数据量比较小或基本上有序时,插入排序算法是三种简单排序算法中最好
的选择,对于更大数据量的排序来说,快速排序通常是最快的方法。
除了速度方面比较排序算法,还需要衡量标准算法需要的内存空间有多大。不同的数据量,不同的系统等等环境
都是 影响算法速度的原因。

小结

  • 排序包括比较数组中数据项的关键字和移动相应的数据项(实际上,是数据项的引用),直到它们排好序为止。
  • 这三个算法的时间复杂度都是O(n²)。不过,某些情况下某个算法可以比其他算法快很多。
  • 不变性是指在算法运行时保持不变的条件。
  • 冒泡排序算法是效率最差的算法,但它最简单。
  • 如果具有相同关键字的数据项,经过排序它们的顺序保持不变,这样的排序是稳定的。
目前已经放到git上。地址是 https://github.com/xinweimingtian/algorithm
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值