排序算法之快速排序笔记

下面代码拷贝这个人的博客

这篇博客写的很清楚,可以去参考看下

白话经典算法系列之六 快速排序 快速搞定:http://blog.csdn.net/morewindows/article/details/6684558

备注:

以一个数为基准,将其他数比它小的放到左边,比它大的放到右边

在以这个数所在位置为边界(i - 1与 i + 1)

分别处理左部份和右部份(由于左半部分(子数组)与右半部分类(子数组)似于父数组,所以利用分治法(递归处理))

1. 排序效率:O(N*logN)

2. 每次左右遍历一遍 只是一个数的位置为调整正确,然后不在处理这个数,而是以这个数的位置为边界,切割成两个子部分分开处理,

这两个部分之间没有任何关系。


3. 处理中间的过程类似一个二叉树:

这个二叉树的节点数就是这个需要排序的数组的元素总数,层数为循环的次数(logN),每次循环操作的步骤数(N)

从而每次排好次序的元素数为2的i次方 i为层数序号(序号从0开始);


public class Sort {
	// 快速排序
	static void quick_sort(int s[], int l, int r) {
		if (l < r) {
			// s[(l + r) / 2]; 将中间的这个数和第一个数交换
			int i = l, j = r, x = s[l];  //s[l]即s[i]就是第一个坑  
			while (i < j) {
				while (i < j && s[j] >= x)
					// 从右向左找第一个小于x的数
					j--;
				if (i < j)
					s[i++] = s[j]; //i++从左往右下一次需要操作的数

				while (i < j && s[i] < x)
					// 从左向右找第一个大于等于x的数
					i++;
				if (i < j)
					s[j--] = s[i]; //j--从右往左下一次需要操作的数
			}
			//退出时,i等于j。将x填到这个坑中。  
			s[i] = x;
			quick_sort(s, l, i - 1); // 递归调用
			quick_sort(s, i + 1, r);
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] s = new int[] { 45, 56, 78, 12, 45, 90, 1, 3 };
		quick_sort(s, 0, 7);
		/*
		 * foreach的语句格式: for(元素类型t 元素变量x : 遍历对象obj){ 引用了x的java语句;
		 * foreach循环只能用于读取,不能改变对应的值 }
		 */
		for (int i : s) {
			System.out.println(i);
		}
	}

}

输出为:

1
3
12
45
45
56
78
90


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值