java排序算法(一)_冒泡排序、插入排序、选择排序

         回顾了下数据结构,写了几个简单的排序,包括冒泡排序,插入排序,选择排序。

         冒泡排序,从左到右依次判断相邻的两元素的大小如果左边的比右边的大,则交换位置。这样一次从左到右的遍历就能得到一个为排序队列中的最大值。然后将这个最大值放置到数组的右侧。因为未完成排序的元素越来越少,那么当所有元素都以完成排序时,循环结束。这里需要一个两侧的循环机制,算法耗时:O(N*N)。见代码:

package Sorting;

/**
 * 冒泡排序
 * @author wly
 * @date 2013-10-19
 */
public class BubbleSort implements Sortable{

	
	public int[] sort(int[] inputArray) {

		if(inputArray.length <= 1) {
			return inputArray;
		} else {
			for(int j=inputArray.length;j>1;j--) {
				int max = inputArray[0]; //注意:一次大循环结束后,需要将max的值重置一下,否则会出错
				for(int i=0;i<j;i++) { //注意:i<j,j的不断变小因为未完成排序的元素越来越少了
					if(inputArray[i] < max) { //交换相邻两个元素
						inputArray[i-1] = inputArray[i];
						inputArray[i] = max;
					} else { //移动标记位置
						max = inputArray[i];
					}
				}
			}
			return inputArray;
		}
	}
}

         选择排序,和冒泡排序相比,选择排序可以省去一些交换的动作,也许这在数组中对算法的效率还是有些影响的。其实现原理就是从左到右依次遍历得到本地遍历的最小值得元素位置index,当一次遍历完成后,进行一次交换。然后再开始下一次遍历,直到所有元素的完成排序。见代码:

package Sorting;

/**
 * 选择排序
 * @author 华都烟梦
 * @date 2013-10-19
 * @description 相对于冒泡排序,选择排序需要同样的O(n*n)次比较,但是只需要进行O(n)次交换
 */
public class SelectionSort implements Sortable{

	public int[] sort(int[] inputArray) {
		if(inputArray.length <= 1) {
			return inputArray;
		} else {
			for(int i=0;i<inputArray.length;i++) {
				int min = inputArray[i];
				int index = i;
				for(int j=i;j<inputArray.length;j++) {
					if(inputArray[j] < min) {
						index = j;
						min = inputArray[j]; //注意:这里必须进行标记赋值,否则将无法"缩小寻找最小值范围"
					}
				}
				int temp = inputArray[i];
				inputArray[i] = inputArray[index];
				inputArray[index] = temp;
			}
			return inputArray;
		}
	}
}

          最后是插入排序,插入排序又比选择排序快了一点。插入排序的关键动作:

       1.将要排序的元素存放到一个临时变量中(其实就是为了腾出位置,为接下来的元素移动做准备)。

       2.在已排序队列中寻找临时变量的插入位置。

       3.移动插入位置之后的元素,腾出位置,使临时变量能够插入。

       4.插入数据。

package Sorting;

/**
 * 插入排序
 * @author 华都烟梦
 * @date 2013-10-19
 */
public class InsertionSort implements Sortable {

	@Override
	public int[] sort(int[] inputArray) {
		if(inputArray.length <= 1) {
			return inputArray;
		} else {
			for(int i=1;i<inputArray.length;i++) { //未排序范围元素循环
				for(int j=0;j<i;j++) { //已排序范围元素循环
					if(inputArray[i] < inputArray[j]) { //注意:这里的大于号(>)或者小于号(<),决定了排序结果的升序或降序
						//1.保存元素到临时变量,腾出位置
						int temp = inputArray[i];
						//2.移动元素
						for(int k=i;k>j;k--) {
							inputArray[k] = inputArray[k-1];
						}
						//3.插入元素
						inputArray[j] = temp;
					}
				}
			}
			return inputArray;
		}
	}
}

         测试一下:

package Sorting;

public class Test {

	static int[] array = {3,1,5,2,7,6,9,4,8};
	public static void main(String[] args) {
		
		//测试冒泡排序
//		Sortable sortable = new BubbleSort();
		
		//测试选择排序
//		Sortable sortable = new SelectionSort();
		
		//测试插入排序
		InsertionSort sortable = new InsertionSort();
		
		//输出测试结果
		int[] result = sortable.sort(array);		
		for(int i:result) {
			System.out.print(i + " ");
		}
	}
}

        输出:1 2 3 4 5 6 7 8 9

 

        代码工程下载:http://download.csdn.net/detail/u011638883/6426489

       O啦~~~

       转载请保留出处:http://blog.csdn.net/u011638883/article/details/12883607

       谢谢!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值