算法之選擇排序

簡單選擇排序:

package SelectSort;

import InsertSort.shellSort;

//選擇排序之簡單選擇排序
//簡單選擇排序:
//基本思路:
//1.從一組數中選取最小的數與第一個數交換
//2.再從剩下的數組選取最小的數與第二個數交換
//3.循環至倒數第二個數與最後一個數比較爲止
public class SimpleSelectSort {
	public int[] selectSort(int[] data){
		int tmp = 0;
		int position=0; 
		for(int i=0;i<data.length;i++){
			tmp = data[i];
			for(int j=i+1;j<data.length;j++){
				if(tmp>data[j]){
					tmp = data[j];
					position = j;
					data[position] = data[i];
					data[i] = tmp;
				}
			}
		}
		return data;
	}
	public String toString(int[] data){
		if(data.length==0){
				return "[]";
			}else{
				StringBuilder sb = new StringBuilder("[");
				for(int i = 0;i<data.length;i++){
				sb.append(data[i]+",");
			}
			int len = sb.length();
			sb.delete(len-1,len);
			return sb.append("]").toString();
		}
	}
	
	public static void main(String[] args){
		int[] data = {1,67,54,6,3,78,34,12,45,56,100};
		SimpleSelectSort dis = new SimpleSelectSort();
		System.out.println(dis.toString(dis.selectSort(data)));
	}
}
堆排序:


package SelectSort;

import java.util.Arrays;

public class HeapSort {  
	  
	//交換兩者間的數
   public static void swap(int[] data,int i,int j){
	   int tmp = data[i];
	   data[i] = data[j];
	   data[j] = tmp;
	   
   }
   public static void heapSort(int[] data){
	   int arrayLength = data.length;
	   //循環創建堆
	   for(int i = 0;i<arrayLength-1;i++){
		   //創建堆
		   //自下至上創建堆,先是獲得最後一個葉子結點的父節點
		   //比較父節點與其兩個子節點間的大小,子節點大則交換
		   buildMaxheap(data,arrayLength-1-i);
		   //堆創建好之後,需要將堆頂元素與最大索引處交換
		   swap(data,0,arrayLength-1-i);
		  
	   }
	   System.out.println("排序後數組:" + Arrays.toString(data));
   }
   //建造大堆頂
   public static void buildMaxheap(int[] data,int lastIndex){
	   for(int parent = (lastIndex-1)/2;parent>=0;parent--){
		 //得到該父節點下的子節點,進行比較,交換
		   //得到的是父節點下的左子節點,並且作爲最大數的一個索引
		   int biggestIndex = parent*2+1;
		   if(biggestIndex<lastIndex){
			   //判斷該左子節點是否還有右子節點
			  
				   //如果左子節點比右子節點小,則把biggestIndex加一,biggestIndex總是記錄最大值
				   if(data[biggestIndex]<data[biggestIndex+1]){
					   biggestIndex++;
				   }
			   
		   }
		 //確定葉子結點,用最大的葉子結點數與父節點作比較,父節點小則交換
		   if(data[parent]<data[biggestIndex]){
			   //交換兩者
			   swap(data,parent,biggestIndex);  
			   //parent = biggestIndex;
			   biggestIndex = parent;
		   }
		   //將最大值索引交換  
		  // biggestIndex = parent;
		   
	   }
   }
	 public static void main(String[] args) {  
		//int[] array = {1,13,44,69,97,53,29,42,96,51,40,12,8,14,10,100};
		int[] array = {13,69,97,53,29,42,96,51,40,12,8,14,10,100};
		HeapSort.heapSort(array);   
	}
  
}


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