基本排序算法

1. 插入排序法

   

        /**
	 * 插入排序法
	 * @param a
	 */
	static void insertionSort( ArrayList<Integer> a){
		int j;
		for( int p = 1; p < a.size(); p++ ){
			Integer tmp = a.get(p);
			for( j = p; j > 0 && tmp.compareTo(a.get(j - 1)) < 0; j-- ) {
				System.out.println("change " + a.get(j) + "  " + a.get(j - 1));
				a.set(j, a.get(j - 1));
			}
			a.set(j, tmp);
			System.out.println(" p = " + p + " change " + a.get(j) + "  " + tmp);
		}
	}


2. 希尔排序法

   

       /**
	 * 希尔排序
	 * @param a
	 */
	static void shellSort( ArrayList<Integer> a ){
		int j;
		for( int gap = a.size() / 2; gap > 0; gap /= 2 ){
			for( int i = gap; i < a.size(); i++ ){
				Integer tmp = a.get(i);
				for( j = i; j >= gap && tmp.compareTo(a.get(j - gap)) < 0; j-=gap ){
					System.out.println("change " + a.get(j) + "  " + a.get(j - gap));
					a.set(j, a.get(j - gap));
				}
				System.out.println(" i = " + i + " change " + a.get(j) + "  " + tmp);
				a.set(j, tmp);
			}
			System.out.println(" gap  = " + gap);
		}
	}

3. 归并排序


  

       /**
	 * 归并排序
	 * @param a
	 * @param tmpArray
	 * @param left
	 * @param right
	 */
	static void mergeSort( ArrayList<Integer> a, ArrayList<Integer> tmpArray, int left, int right ){
		if( left < right ){
			int center = ( left + right ) / 2;
			mergeSort(a, tmpArray, left, center);
			mergeSort(a, tmpArray, center + 1, right);
			merge(a, tmpArray, left, center + 1, right);
		}
	}
	
	static void merge( ArrayList<Integer> a, ArrayList<Integer> tmpArray, int leftPos, int rightPos, int rightEnd ){
		int leftEnd = rightPos - 1;
		int tmpPos = leftPos;
		int numElements = rightEnd - leftPos + 1;
		
		while( leftPos <= leftEnd && rightPos <= rightEnd ){
			if( a.get(leftPos).compareTo(a.get(rightPos)) <= 0 ){
				tmpArray.set(tmpPos++, a.get(leftPos++));
			}
			else{
				tmpArray.set(tmpPos++, a.get(rightPos++));
			}
		}
		
		while( leftPos <= leftEnd ){
			tmpArray.set(tmpPos++, a.get(leftPos++));
		}
		
		while( rightPos <= rightEnd ){
			tmpArray.set(tmpPos++, a.get(rightPos++));
		}
		
		for( int i = 0; i < numElements; i++, rightEnd--){
			a.set(rightEnd, tmpArray.get(rightEnd));
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值