基本排序算法

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));
		}
	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章