在學習算法的過程中,我們難免會接觸很多和排序相關的算法。總而言之,對於任何編程人員來說,基本的排序算法是必須要掌握的。
從今天開始,我們將要進行基本的排序算法的講解。Are you ready?Let‘s go~~~
1、排序算法的基本概念的講解
時間復雜度:需要排序的的關鍵字的比較次數和相應的移動的次數。
空間復雜度:分析需要多少輔助的內存。
穩定性:如果記錄兩個關鍵字的A和B它們的值相等,經過排序后它們相對的位置沒有發生交換,那么我們稱這個排序算法是穩定的。
否則我們稱這個排序算法是不穩定的。
排序算法的常見分類:
1、內部排序(最常見的一種排序方式,不需要借助第三方輔助存儲工具)
2、外部排序(需要借助外部存儲來輔助完成相關的排序操作)
如果參與排序的數據元素非常的多,數據量非常的大,計算機無法把整個排序過程放到內存中進行的話,
我們必須借助外部存儲器如磁盤來完成,這種排序方式,我們稱之為外部排序。
其中外部排序最常見的就是多路歸並排序,即將原始文件分解成多個能夠一次性裝入內存的部分,分別把每一部分調入
內存完成相應的排序,接下來在對多個有序的外部文件進行多路歸並排序。
對於我們絕大多數的程序員而言,我們經常遇到的為內部排序。接下來我們將要對常見的內部排序進行相應的講解。
今天要講解的內部排序為:
歸並排序
1.歸並排序的基本概念的講解
2.歸並排序的Java代碼實現
package com.yonyou.test;
/**
* 內部排序算法之歸並排序
* 默認按照從小到大進行排序操作
* @author 小浩
* @創建日期 2015-3-27
*/
public class Test{
public static void main(String[] args) {
//需要進行排序的數組
int[] array=new int[]{8,3,2,1,7,4,6,5};
//輸出原數組的內容
printResult(array);
//歸並排序操作
sort(array,0,array.length-1);
//輸出排序后的相關結果
printResult(array);
}
/**
* 歸並排序
* @param array
*/
private static void sort(int[] array,int i,int j) {
if(i<j)
{
int middle=(i+j)/2;
//遞歸處理相關的合並事項
sort(array,i,middle);
sort(array,middle+1,j);
merge(array,i,middle,j);
}
}
/**
* 合並相關的數組內容
* 同時使合並后的數組仍然有序
* @param array
* @param i
* @param middle
* @param j
* 4 5 6 9 10 11
*
*/
private static void merge(int[] array, int i, int middle, int j) {
//創建一個臨時數組用來存儲合並后的數據
int[] temp=new int[array.length];
int m=i;
int n=middle+1;
int k=i;
while(m<=middle&&n<=j)
{
if(array[m]<array[n])
temp[k++]=array[m++];
else
temp[k++]=array[n++];
}
//處理剩余未合並的部分
while(m<=middle)
{
temp[k++]=array[m++];
}
while(n<=j)
{
temp[k++]=array[n++];
}
//將臨時數組中的內容存儲到原數組中
while(i<=j)
{
array[i]=temp[i++];
}
}
/**
*
* 輸出相應數組的結果
* @param array
*/
private static void printResult(int[] array) {
for(int value:array)
System.out.print(" "+value+" ");
System.out.println();
}
/**
* 交換數組中兩個變量的值
* @param array
* @param i
* @param j
*/
private static void swap(int[] array,int i,int j){
int temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
