算法--排序

1 冒泡排序

/**
	 * 冒泡排序 说明:从第一个开始,和后面的每个数进行比较,保证第一个 位置的数在第一个位置开始是最小的,第二位置的数和后面的比较,保证
	 * 第二个位置的数在第二开始是最小的,后面依次类推 从另外一个角度讲就是取最小的数放在第一个位置,取第二小的数放在第二个位置,后面依次类推
	 * 
	 * @param data
	 *            被排序的数组
	 */
	public static void bubbleSort(Integer[] data) {
		for (int i = 0; i < data.length; i++) {
			for (int j = i + 1; j < data.length; j++) {
				if (data[i] > data[j]) {
					// 数据互换,保证data[i]不大于data[j]
					Integer temp = data[i];
					data[i] = data[j];
					data[j] = temp;
				}
			}
		}
	}

2 直接插入排序
直接插入排序类似打扑克牌,将每一张扑克牌插入到已经排好序的牌组中。
图解如下:
这里写图片描述
图片摘自:
http://www.cnblogs.com/MOBIN/p/4679208.html

/**
	 * 直接插入排序 数据从索引1开始。
	 * 说明:整理手中扑克牌顺序的过程。将一张牌插入已经排好序的牌组中,在牌组中找到合适的位置,被排序中数据的索引从1开始,防止出现数组越界。
	 * 
	 * @param data
	 */
	public static void insertSort(Integer[] data) {
		// 索引为0存储临时数据,从第三个数开始进行插入合适的位置
		for (int i = 2; i < data.length; i++) {
			data[0] = data[i];// 存储被比较的元素
			// 从已排好序最后位置开始向前推,找到合适的位置插入
			for (int j = i; j >= 1; j--) {
				if (data[j] < data[0]) {
					data[j + 1] = data[0];// 从后往前,插入数据大于索引第j,说明应该插入j+1的位置,
					//而索引j位置的数据与j+1的数据相同,此时插入j+1的位置
					break;
				} else {
					data[j] = data[j - 1];// 不满足条件,则将数据后移
				}
			}
		}
		// 输出排好序的序列
		for (int i = 1; i < data.length; i++) {
			System.out.print(data[i] + " ");
		}
	}

教材中通俗易懂的代码:

public static void insertSort_01(Integer[] data) {
		
		for (int i = 2; i < data.length; i++) {	
			data[0] = data[i];
			int j;
			for (j = i - 1;  data[0] < data[j]; j--) {//找到插入的位置,应该插入到j+1的位置
				data[j + 1] = data[j];
			}
			data[j + 1] = data[0];
		}
		
		//输出排好序的序列
		for (int i = 1; i < data.length; i++) {
			System.out.print(data[i]+" ");
		}
	}

3 快速排序
快速排序:快速排序的中心想法就是找到轴值的最终位置(使其左边的数都小于轴值,右边的数大于轴值),在选择轴值的过程中,保证轴值的左右满足一定的规律左边的数小于轴值,而右边的数大于轴值。然后再从轴值的两边再次选择轴值,与上类似。假设设置两个哨兵,即一个i,一个j,其实哨兵j的使命就是要找小于基准数的数,而哨兵i的使命就是要找大于基准数的数,直到i和j碰头为止。
最差时间复杂度和冒泡排序是一样的都是O(N2),平均时间复杂度为O(NlogN)
参考博客:http://developer.51cto.com/art/201403/430986.htm

/**
	 * 选择轴值。 说明:在找轴值的过程中,扫描右边的数下于轴值,则说明右侧的数不满足轴值两边数据规则,
	 * 即左边的数小于轴值,而右边的数大于轴值。需交换。再扫描左侧也同理。也可从这方面理解,通过不停的 比较,保证了轴值两侧的规则。
	 * 
	 * @param data
	 *            被排序的数据
	 * @param startIndex
	 *            起始区间
	 * @param endIndex
	 *            结束区间
	 * @return 返回轴值
	 */
	public static void quickSort(Integer[] data, Integer startIndex,
			Integer endIndex) {
		if (startIndex < endIndex) {
			Integer position = position(data, startIndex, endIndex);
			quickSort(data, position + 1, endIndex);
			quickSort(data, startIndex, position - 1);
		}
	}
    
    public static int partition(int[] data, int first, int end) {
		int i = first;
		int j = end;
		while (i < j) {
			// 右侧扫描
			while (i < j && data[i] < data[j]) {
				j--;
			}
			if (i < j) {
				// 交换
				int temp = data[i];
				data[i] = data[j];
				data[j] = temp;
				i++;
			}

			// 左侧扫描
			while (i < j && data[i] < data[j]) {
				i++;
			}
			if (i < j) {
				// 交换
				int temp = data[i];
				data[i] = data[j];
				data[j] = temp;
				j--;
			}
		}
		return i;
	}

输入输出:

Scanner sc = new Scanner(System.in);
		//int age = sc.nextInt();    //读取整型输入
		String str=sc.next();//获取String类型
		System.out.println(str);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值