排序算法java 一 --快速排序、直接插入、希尔排序

一、快速排序
1、算法思想:
   通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后按照此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序的序列。
2、实现思路
   a、以第一个关键字k1为基数,将[k1,k2,k3....Kn]这个数据分成两部分,使左区域所有的值都小于等于k1,右区域所有的值都大于等于k1,最后确定两区域的中间位置,这个时候两个子区域的值处于无序状态。
   b、把左区域做为一个整体,用a步骤进行处理,右区域进行相同的处理。(即递归操作)
   c、重复a、b步骤,直到处理完毕。
二、直接插入排序
1、算法概念:
   每次从无序的数据中取出第一个元素,把它插入到有序的数据中的合适位置,使无序表变得有序。
2、算法思想:
   假设待排序的记录存放在数组A[1...n]中,初始是,A[1]自成一个有序的序列,无序的数据为A[2...n],从i=2起直至i=n为止,依次将A[i]插入到当前有序的区域R[1,i-1],生成含n个记录的有序序列。
3、算法实现:
   a、使用一个临时变量temp存储第i个元素(i>=1,下标从0开始)
   b、比较temp和A[i-1],如果temp比A[i-1]小,则A[i]=A[i-1],即比temp大的元素集合依次往右移动一位。
   c、将temp的值赋给A[i];

三、希尔排序
1、算法介绍:
   希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
2、算法思想:
    算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。

 

代码实现

1、快速排序,只要找到一次的执行原理,递归调用自己就可。

	/**
	 * @param args快速排序//逐级找中间一分为二排序
	 */
	
	public static void fastSort(int[] array, int low, int high) {

		//递归实现过程		
		if (low < high) {
			int middle = findMiddle(array, low, high);
			//System.out.println("middle " + middle);
			fastSort(array, low, middle - 1);
			//System.out.println(" ---left " + Arrays.toString(array));
			//System.out.println("+++++middle " + middle);
			fastSort(array, middle + 1, high);
			//System.out.println(" +++right " + Arrays.toString(array));
		}

	}

	private static int findMiddle(int[] array, int low, int high) {
	/* 	//将数组数据小于temp的放在左边,大于的放在右边.										1)、从右边最高位开始比较,如果temp > array[high],将array[high]赋值给array[low]							2)、第一步交换后,从左边最低位low开始比较,如果temp < array[low],将执行 array[high] = array[low]; 					3)、最后将temp 赋值给array[low]	. 如果打印执行过程,就会很清晰。									*/					 
//		low = 0;
//		high = array.length - 1;
		int temp = array[low];

		while (low < high) {

			while (low < high && temp <= array[high]) {
				high--;
			}

			array[low] = array[high];

			while (low < high && temp >= array[low]) {
				low++;
			}
			array[high] = array[low];

		}
		array[low] = temp;
		System.out.println("-array: " + Arrays.toString(array));
		return low;
	}

2、插入排序相对较简单,每一个数每次和他前面的数比较,找到第一个比较小的和最后一个比他大的数中间插入。实现过程是:用变量存储起来,只要比他大就将比他大的值赋值给它原来的位置,然后做标前移,重复上述步骤,直到不再满足比他大,将t存储emp变量值赋值给不比它大的数据的坐标 +1 的位置。

/**
	 * 直接插入排序
	 */
	public static void insertSort(int []array){
		//13, 6, 20, 15, 1, 8, 1 
		int j = 0;
		for (int i = 0; i < array.length; i++) {
			
			int temp = array[i];
			j = i - 1;
			while(j >= 0 && temp < array [j]){
				
				array[j+1] = array[j];
				j--;
//				System.out.println("-------" + Arrays.toString(array));
			}
			array[j+1] = temp;
			System.out.println("++++++++++" + Arrays.toString(array));
		}
	}

 

3、希尔排序 对比直接插入排序,你会发现仅仅是希尔排序先比较间隔为长度一半的两个元素,交换位置。逐渐缩小间隔来实现。

/**
	 * 希尔排序
	 */
	public static void shellSort(int []array){
		int length = array.length;
		int d = length / 2;
		while(d >= 1){
			
			int j = 0;
			for (int i = 0; i < array.length; i++) {
				
				int temp = array[i];
				j = i - d;
				while(j >= 0 && temp < array [j]){
					
					array[j+d] = array[j];
					j -= d;
				}
				array[j+d] = temp;
			}
			d /= 2;
					System.out.println("-------" + Arrays.toString(array));
		}
	}




 

你可能感兴趣的:(排序算法java 一 --快速排序、直接插入、希尔排序)