基本排序算法

  排序算法有很多,保持每天更新写一个,有时间会写多个。

一、冒泡排序算法

 

<span style="font-size:14px;">/**
	 * 冒泡排序 从小到大
	 * 算法思想:
	 *         将两个相邻的数据相比较(这里是从小到大排序), 如果后一个大于前一个就交换其值,
	 *         每一次经过遍历后就会比较出一个最大值,该最大值会被交换到最右边(相对于此次遍历而言)
	 *         每次遍历只能比较出一个“最大值”(相对于此次遍历而言),假设一个数组长度为n,那么需要遍历n-1次
	 *         才可以完全排序完,因此使用两层for循环,可以看出来,写多层循环的时候
	 * @param arr
	 *            源数组,待排序
	 * @return
	 */
	public static int[] bubbleSort(int[] arr) {
		System.out.println("冒泡排序(从小到到):");
		//这个for循环没遍历一次,就会将一个最大值放在“最右边”
		//如果是从大到小排序则每次遍历后就会将一个最小的值排到“最左边”
		for (int i = 0;i<arr.length-1;i++) {
			for (int j = 0; j < arr.length-1-i; j++) {
				//实现从大到小只需要将>改成<即可,
				if (arr[j] > arr[j +1]) {
					int temp = arr[j];
					temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
		return arr;
	}</span>


二、快速排序

  

// ==================== 快速排序 ========================//
	/**
	 * 快速排序算法思想: 首先选取一个基准元素,通常那个是选取数组第一个元素或是最后一个元素(相对于此次遍历来说)。
	 *           通过一趟排序将要排序的数据分割成独立的两部分,
	 *           其中一部分的所有数据都比另外一部分的所有数据都要小,
	 *           然后再按此方法对这两部分数据分别进行快速排序,
	 *           整个排序过程可以递归进行,以此达到整个数据变成有序序列。          
	 * 
	 * @param a
	 * @return
	 */

	private static int[] quick(int[] a) {
		if (a.length > 0) {
			quickSort(a, 0, a.length - 1);
		}
		return a;
	}

	private static void quickSort(int[] a, int low, int high) {
		if (low < high) { // 如果不加这个判断递归会无法退出导致堆栈溢出异常
			int middle = getMiddle(a, low, high);
			quickSort(a, 0, middle - 1);
			quickSort(a, middle + 1, high);
		}
	}

	private static int getMiddle(int[] a, int low, int high) {
		// 选取基准元素
		int temp = a[low];
		//
		while (low < high) {
			// 找到比基准元素小的元素位置
			// 从最右边开始将每一个元素和基元素比较,如果该元素比基准元素要大,那么就左移动一位继续进行比较
			// 如果恰好temp为最小的元素,那么这个while会执行high次知道high和low相等。

			while (low < high && a[high] >= temp) {
				high--;
			}
			// 如果遍历时发现有比基元素更小的就赋值给基准元素,这个low和high可能会相等。
			a[low] = a[high];
			// 这个循环不执行的条件是:所选取的基准元素恰好是最小的元素,那么此时low和hignt是相等的,
			// 因为在上一个while循环中hight做--运算。
			while (low < high && a[low] <= temp) {
				low++;
			}
			a[high] = a[low];
		}
		a[low] = temp;
		return low;
	}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值