1. 程式人生 > >初探排序學習筆記

初探排序學習筆記

system ble -- 單選 希爾 urn 對數 數據 遞歸

簡單選擇排序

思路:選出最小的元素,放在第一個位置。之後在剩下的元素中,選出最小的元素。放在第二個位置.........以此類推,直到完畢排序。

package h;

public class MyA 
{
  static void selectOne(int[] a, int begin)
  {
    int p = begin; //如果修正法
     for(int i=begin+1; i<a.length; i++){
      if(a[i] < a[p]) p = i;  //記錄最小元素所在位置
    }
  
    {int tmp = a[p]; a[p] = a[begin]; a[begin] = tmp; }  //交換元素
  }
 
  static void show(int[] a)
 {
  for(int i=0; i<a.length; i++) System.out.print(a[i] + " ");
  System.out.println();
 }
 
 public static void main(String[] args) 
 {
    int[] a = {12,8,3,5,16,22,9,14,2,17};
    show(a);
  
    for(int k=0; k<a.length-1; k++){
     selectOne(a, k);
     show(a);
    }
  
 }
}



插入排序

思路:把新元素加到已經有序的隊列中

public class MyA
{
	// 第k項插入到前邊的序列中
	static void insertOne(int[] a, int k)
	{
		for(int i=0; i<=k; i++){
			if(a[i]>=a[k]){ //找到了插入的位置
				int tmp = a[k];
				for(int j=k-1; j>=i; j--) a[j+1] = a[j];
				a[i] = tmp;
				break;  
			}
		}
	}
	
	static void show(int[] a)
	{
		for(int i=0; i<a.length; i++) System.out.print(a[i] + " ");
		System.out.println();
	}
	
	public static void main(String[] args)
	{
		int[] a = {15,22,13,9,16,23,18,4,33,25,14};
		show(a);
		
		for(int i=1; i<a.length; i++){
			insertOne(a,i);
			show(a);
		}

	}
}


高速排序

思路:以一個元素作為標尺,將數據分成兩塊。一塊是小於標尺元素大小的。還有一塊是大於等於標尺元素大小的。之後再進行遞歸。

將剛才分成的兩塊依照之前的方法再次進行高速排序,直到改分區(塊)內沒有須要排序的元素。

package j;

class MyA
{
	static void show(int[] a)
	{
		for(int i=0; i<a.length; i++) System.out.print(a[i] + " ");
		System.out.println();
	}
	
	static void quickSort(int[] a, int begin, int end)
	{
		if(end-begin<=1) return;
		
		int x = a[begin];  // 標尺
		int p1 = begin;
		int p2 = end;
		boolean dr = true;  // 比較方向 一次左一次右
		
L1:	while(p1<p2){
			if(dr){
				for(int i=p2; i>p1; i--){
					if(a[i] <= x){
						a[p1++] = a[i];
						p2 = i;
						dr = !dr;
						continue L1;
					}
				}
				p2 = p1;
			}
			else{
				for(int i=p1; i<p2; i++){
					if(a[i] >= x){
						a[p2--] = a[i];
						p1 = i;
						dr = !dr;
						continue L1;
					}
				}
				p1 = p2;
			}
		}
		a[p1] = x;
		
		quickSort(a,begin,p1-1);
		quickSort(a,p1+1,end);
	}
		
	public static void main(String[] args)
	{
		int[] a = {15,22,13,9,16,33,15,23,18,4,33,25,14};
		show(a);
		
		quickSort(a, 0, a.length-1);
		show(a);
	}
}


希爾排序

思路:因為原始數據的有序性對排序時間的長短非常一定的影響。按一定的步長對數據進行分組。使用插入排序法進行排序。之後不斷的減少步長。直到步長為1。

public class MyA
{
	//希爾排序之中的一個趟排序, dk 為步長
	static void shellOne(int[] data, int dk)
	{
		for(int k=0; k<dk;k++){
			//子組做簡單插入排序
			for(int i=1; k+i*dk<data.length; i++){
				//確定插入位置
				for(int j=0; j<=i; j++){
					if(data[k+j*dk] >= data[k+i*dk]){
						int tmp = data[k+i*dk];
						for(int p=i-1; p>=j;p--) data[k+(p+1)*dk] = data[k+p*dk];
						data[k+j*dk] = tmp;
						break;
					}
				}
			}
		}
	}
	
	static void show(int[] data)
	{
		for(int i=0; i<data.length; i++) System.out.print(data[i] + " ");
		System.out.println();
	}
	
	public static void main(String[] args)
	{
		int[] a = {49,38,65,97,76,13,27,49,55,4};
		show(a);
		
		shellOne(a,5);
		show(a);
		shellOne(a,3);
		show(a);
		shellOne(a,1);
		show(a);
	}
}


冒泡排序

思路:相鄰元素之間進行比較。將大數放在後面。一趟排序之後則把最大數放到了末尾。多次排序就可以。

這樣把小數往前移動,就像把大石頭沈入海底,小石頭冒泡浮上去。

package g;

public class MyA 
{
	static void bubbleOne(int[] a, int n)
	{
		for(int i=0; i<n; i++){
			if(a[i] > a[i+1]) { int tmp = a[i]; a[i]=a[i+1]; a[i+1]= tmp;}
		}
	}
	
	static void show(int[] a)
	{
		for(int i=0; i<a.length; i++) System.out.print(a[i] + " ");
		System.out.println();
	}
	
	public static void main(String[] args) 
	{
		int[] a = {3,15,9,18,22,16,5,12,7};
		show(a);
		
		for(int k=0;  k<a.length-1; k++){
			bubbleOne(a, a.length-k-1);
			show(a);
		}			
	}

}


初探排序學習筆記