所謂排序,就是根據排序碼的遞增或者遞減順序把資料元素依次排列起來,使一組任意排列的元素變為一組按其排序碼線性有序的元素。本文將介紹八種最為經典常用的內部排序演算法,包括插入排序(直接插入排序,希爾排序)、選擇排序(直接選擇排序,堆排序)、交換排序(氣泡排序,快速排序)、歸併排序、分配排序(基數排序)。實際上,無論是基本排序方法(直接插入排序,直接選擇排序,氣泡排序),還是高效排序方法(快速排序,堆排序,歸併排序)等,它們各有所長,都擁有特定的使用場景。因此,在實際應用中,我們必須根據實際任務的特點和各種排序演算法的特性來做出最合適的選擇。一般地,我們衡量乙個演算法的指標包括:
筆者將在本文著重**上述八種排序演算法的思想和實現,並就各演算法根據以上指標進行分析和歸類,以便進一步熟悉它們各自的應用場景。
插入排序的基本思想:每步將乙個待排序元素,按其排序碼大小插入到前面已經排好序的一組元素中,直到元素全部插入為止。在這裡,我們介紹三種具體的插入排序演算法:直接插入排序,希爾排序與折半插入排序。
1、直接插入排序
直接插入排序的思想:當插入第i(i>=1)個元素時,前面的v[0],…,v[i-1]等i-1個 元素已經有序。這時,將第i個元素與前i-1個元素v[i-1],…,v[0]依次比較,找到插入位置即將v[i]插入,同時原來位置上的元素向後順移。在這裡,插入位置的查詢是順序查詢。直接插入排序是一種穩定的排序演算法,其實現如下:
/**
* title: 插入排序中的直接插入排序,依賴於初始序列
* description: 在有序序列中不斷插入新的記錄以達到擴大有序區到整個陣列的目的
* 時間複雜度:最好情形o(n),平均情形o(n^2),最差情形o(n^2)
* 空間複雜度:o(1)
* 穩 定 性:穩定
* 內部排序(在排序過程中資料元素完全在記憶體)
*@author rico
*@created 2023年5月20日 上午10:40:00
*/public
class
straightinsertionsort }}
}return target;}}
2、希爾排序
希爾排序的思想:設待排序序列共n個元素,首先取乙個整數gap/**
* title: 插入排序中的希爾排序,依賴於初始序列
* description: 分別對間隔為gap的gap個子序列進行直接插入排序,不斷縮小gap,直至為 1
* * 剛開始時,gap較大,每個子串行元素較少,排序速度較快;
* 待到排序後期,gap變小,每個子串行元素較多,但大部分元素基本有序,所以排序速度仍較快。
* * 時間複雜度:o(n) ~ o(n^2)
* 空間複雜度:o(1)
* 穩 定 性:不穩定
* 內部排序(在排序過程中資料元素完全在記憶體)
*@author rico
*@created 2023年5月20日 上午10:40:00
*/public
class
shellsort while(j >= 0 && target[j] > temp); // 向前比較的終止條件
target[j + gap] = temp; // 將待插入值插入合適的位置}}
}while(gap > 1);
}return target;}}
3、折半插入排序
折半插入排序的思想:當插入第i(i>=1)個元素時,前面的v[0],…,v[i-1]等i-1個 元素已經有序。這時,折半搜尋第i個元素在前i-1個元素v[i-1],…,v[0]中的插入位置,然後直接將v[i]插入,同時原來位置上的元素向後順移。與直接插入排序不同的是,折半插入排序比直接插入排序明顯減少了關鍵字之間的比較次數,但是移動次數是沒有改變。所以,折半插入排序和插入排序的時間複雜度相同都是o(n^2),但其減少了比較次數,所以該演算法仍然比直接插入排序好。折半插入排序是一種穩定的排序演算法,其實現如下:
/**
* title: 插入排序中的折半插入排序,依賴於初始序列
* description: 折半搜尋出插入位置,並直接插入;與直接插入搜尋的區別是,後者的搜尋要快於順序搜尋
* 時間複雜度:折半插入排序比直接插入排序明顯減少了關鍵字之間的比較次數,但是移動次數是沒有改變。所以,
* 折半插入排序和插入排序的時間複雜度相同都是o(n^2),在減少了比較次數方面它確實相當優秀,所以該演算法仍然比直接插入排序好。
* 空間複雜度:o(1)
* 穩 定 性:穩定
* 內部排序(在排序過程中資料元素完全在記憶體)
*@author rico
*@created 2023年5月25日 下午12:03:23
*/public
class
binaryinsertsort else
if(target[mid] > temp)else
}// left及其後面的資料順序向後移動,並在left位置插入
for (int j = i; j > left; j--)
target[left] = temp;}}
}return target;}}
排序演算法概述
所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。不穩定排序演算法可能會在相等的鍵值中改變紀錄的相對次序,但是穩定排序演算法從來不會如此。排序大概分為四類 交換排序 包括氣泡排序,快速排序。選擇排序 包括直接選擇排序,堆排序。插入排序 包括直接插入排序,希爾排序...
排序演算法概述
提到排序演算法我們要知道兩個經常提到的概念 1 排序演算法的穩定性 所謂 穩定性 是 指,在待排序陣列出現的兩個相同的元素,排序之後相對維持保持不變。比如 待排序陣列為arr 排序之後元素變為arr new 並且arr new中的第乙個是arr中的第乙個1,arr new中的第二個1是arr中的第二...
排序演算法 一 概述
排序是程式開發中一種非常常見的操作,對一組任意的資料元素 或記錄 經過排序操作後,就可以把他們變成一組按關鍵字排序的有序佇列。對於排序演算法從以下幾點去衡量演算法的優劣 時間複雜度,所謂時間複雜度就是將一組數從無序到有序所花費的時間,通常使用乙個量級去衡量,比如o n 或者 o n n 空間複雜度,...