1. 基本排序演算法原理
演算法原理:每次對相鄰的兩個元素進行比較,若前者大於後者則進行交換,如此一趟下來最後一趟的就是最大元素,重復以上的步驟,除了已經確定的元素 。
演算法原理:每次對相鄰的兩個元素進行比較,若前者大於後者則進行交換,如此一趟下來最後一趟的就是最大元素,重復以上的步驟,除了已經確定的元素
演算法步驟
1) 設置兩個變數i、j,排序開始的時候:i=0,j=n-1;
2)第一個數組值作為比較值,首先保存到temp中,即temp=A[0];
3)然後j-- ,向前搜索,找到小於temp後,因為s[i]的值保存在temp中,所以直接賦值,s[i]=s[j]
4)然後i++,向後搜索,找到大於temp後,因為s[j]的值保存在第2步的s[i]中,所以直接賦值,s[j]=s[i],然後j--,避免死循環
5)重復第3、4步,直到i=j,最後將temp值返回s[i]中
6) 然後採用「二分」的思想,以i為分界線,拆分成兩個數組 s[0,i-1]、s[i+1,n-1]又開始排序
排序圖解
演算法原理:從第一個元素開始,左邊視為已排序數組,右邊視為待排序數組,從左往右依次取元素,插入左側已排序數組,對插入新元素的左側數組重新生成有序數組 。需要注意的是,在往有序數組插入一個新元素的過程中,我們可以採用按 順序循環 比較,也可以通過 折半查找法 來找到新元素的位置,兩種方式的效率 取決於數組的數據量
演算法原理:希爾排序也是利用插入排序的思想來排序。希爾排序通過將比較的全部元素分為幾個區域來提升插入排序的性能。這樣可以讓一個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,需排序的數據幾乎是已排好的了,插入效率比較高。
排序圖解
選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。選擇排序的主要優點與數據移動有關。如果某個元素位於正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當中至少有一個將被移到其最終位置上,因此對n個元素的表進行排序總共進行至多n-1次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬於非常好的一種。
歸並排序,顧名思義就是一種 「遞歸合並」 的排序方法(這個理解很重要)。對於一個數列,我們把它進行二分處理,依次遞歸下去,然後將小范圍的數進行排序,最後將其合並在一起。就實現了歸並排序。
這實際上是運用了 分治思想 ,顯然,想要把一個數列排好序,最終達到的目的就是它的任何一部分都是有序的。這樣的話,我們可以考慮分別把數列分成N多個部分,讓每個部分分別有序,然後再將其統一,變成所有的東西都有序。這樣就實現了排序。這個想法就叫分治思想。
排序圖解
排序圖解
2. 排序演算法是怎樣的
一、背景介紹
在計算機科學與數學中,排序演算法(Sorting algorithm)是一種能將一串資料依照特定排序方式進行排列的一種演算法。
最常用到的排序方式是數字順序以及字典順序。
有效的排序演算法在一些演算法(例如搜尋演算法與合並演算法)中是重要的, 如此這些演算法才能得到正確解答。
排序演算法也用在處理文字資料以及產生人類可讀的輸出結果。
基本上,排序演算法的輸出必須遵守下列兩個原則:
1、輸出結果為遞增序列(遞增是針對所需的排序順序而言);
2、輸出結果是原輸入的一種排列、或是重組;
雖然排序演算法是一個簡單的問題,但是從計算機科學發展以來,在此問題上已經有大量的研究。 更多的新演算法仍在不斷的被發明。
二、知識剖析
查找和排序演算法是演算法的入門知識,其經典思想可以用於很多演算法當中。因為其實現代碼較短,應用較常見。 所以在面試中經常會問到排序演算法及其相關的問題。但萬變不離其宗,只要熟悉了思想,靈活運用也不是難事。
一般在面試中最常考的是快速排序和冒泡排序,並且經常有面試官要求現場寫出這兩種排序的代碼。對這兩種排序的代碼一定要信手拈來才行。除此之外,還有插入排序、冒泡排序、堆排序、基數排序、桶排序等。
三、常見的幾種演算法:
冒泡演算法、選擇排序、插入排序、希爾排序、歸並排序、快速排序
演算法的特點:
1、有限性:一個演算法必須保證執行有限步之後結束。
2、確切性: 一個演算法的每一步驟必須有確切的定義。
3、輸入:一個演算法有零個或多個輸入,以刻畫運算對象的初始情況,所謂零個輸入是指演算法本身給定了初始條件。
4、輸出:一個演算法有一個或多個輸出。沒有輸出的演算法毫無意義。
5、可行性:演算法中執行的任何計算步驟都是可以被分解為基本的可執行的操作步,即每個計算步都可以在有限時間內完成(也稱之為有效性)。
3. c語言插入法排序的演算法步驟
演算法描述
一般來說,插入排序都採用in-place在數組上實現。具體演算法描述如下:
從第一個元素開始,該元素可以認為已經被排序
取出下一個元素,在已經排序的元素序列中從後向前掃描
如果該元素(已排序)大於新元素,將該元素移到下一位置
重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
將新元素插入到該位置後
重復步驟2~5
如果比較操作的代價比交換操作大的話,可以採用二分查找法來減少比較操作的數目。該演算法可以認為是插入排序的一個變種,稱為二分查找排序。
范常式式碼
void insertion_sort(int array[], int first, int last)
{
int i,j;
int temp;
for (i = first+1; i<=last;i++)
{
temp = array[i];
j=i-1;
while((j>=first) && (array[j] > temp))
{
array[j+1] = array[j];
j--;
}
array[j+1] = temp;
}
}
4. 排序演算法
它重復地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從A到Z)錯誤就把他們交換過來。走訪元素的工作是重復地進行直到沒有相鄰元素需要交換,也就是說該元素已經排序完成。
這個演算法的名字由來是因為越大的元素會經由交換慢慢「浮」到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名「冒泡排序」
1、比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
2、對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
3、針對所有的元素重復以上的步驟,除了最後一個。
4、持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較
5. 排序法的排序法的步驟
1、 組成評價的專家組。包括人事部門的人員、評價專家以及相關的其他人員。根據不同的評價對象和目的,專家構成可以不同。
2、 制訂評價指標排序表:
3、 統計排序結果。由專家根據自己的主觀判斷對評價對象中一級指標或二級指標對與其相對應的一級指標影響程度的大小,由小到大進行排序、填入表中,回收並進行統計。然後將統計結果再反饋給專家。如此進行兩三次反復,最後予以確定。
4、 將回收結果進行數理統計,計算評價指標的權值,公式如下:
n --評價指標的項數
Lij--第i項指標排在第j位的專家人數
Cj--排序的分值。一般規定:
C1=n,C2=n-1,…,Cj=n-j+1,…Cn=1
6. 快速排序法步驟
演算法步驟:
1.從數列中挑出一個元素,稱為「基準」(pivot),
2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。
在這個分區退出之後,該基準就處於數列的中間位置。這個稱為分區(partition)操作。
3.遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最後的位置去。
7. 排序演算法【圖文理解】
先給出交換方法實現
相鄰兩個元素相比較,大的往後放
在n個數中找到最小(大)數與第一個數交換位置【每輪循環,都確定一個元素】
將元素插入已排序的數組中
注意插入時,如果滿足條件,就放到最後一個;不滿足條件,已排序數組就依次往後挪位;
1、拿第一個元素為基準
2、從最後一個元素開始往前找,如果第j個元素大於基準,停下來;從第一個元素開始往後找,如果第i個元素小於基準,停下來;如果i<j,就交換換i和j所在位置的元素;
3、j繼續往前找,i繼續往後找,找到就交換,直到i==j
4、交換基準所在位置和i所在位置的元素的值,得到第一次排序結果:小於基準的-基準-大於基準的
5、遞歸將基準兩邊的元素繼續進行快速排序
1、先將元素分成n組,對每組繼續插入排序;
2、再將元素分為n/2組,對每組繼續插入排序
3、知道n/2=1,對改組進行插入排序;即為最終的結果
8. 快速排序演算法原理與實現
快速排序的基本思想就是從一個數組中任意挑選一個元素(通常來說會選擇最左邊的元素)作為中軸元素,將剩下的元素以中軸元素作為比較的標准,將小於等於中軸元素的放到中軸元素的左邊,將大於中軸元素的放到中軸元素的右邊。
然後以當前中軸元素的位置為界,將左半部分子數組和右半部分子數組看成兩個新的數組,重復上述操作,直到子數組的元素個數小於等於1(因為一個元素的數組必定是有序的)。
以下的代碼中會常常使用交換數組中兩個元素值的Swap方法,其代碼如下
publicstaticvoidSwap(int[] A, inti, intj){
inttmp;
tmp = A[i];
A[i] = A[j];
A[j] = tmp;
(8)排序問題演算法步驟擴展閱讀:
快速排序演算法 的基本思想是:將所要進行排序的數分為左右兩個部分,其中一部分的所有數據都比另外一 部分的數據小,然後將所分得的兩部分數據進行同樣的劃分,重復執行以上的劃分操作,直 到所有要進行排序的數據變為有序為止。
定義兩個變數low和high,將low、high分別設置為要進行排序的序列的起始元素和最後一個元素的下標。第一次,low和high的取值分別為0和n-1,接下來的每次取值由劃分得到的序列起始元素和最後一個元素的下標來決定。
定義一個變數key,接下來以key的取值為基準將數組A劃分為左右兩個部分,通 常,key值為要進行排序序列的第一個元素值。第一次的取值為A[0],以後毎次取值由要劃 分序列的起始元素決定。
從high所指向的數組元素開始向左掃描,掃描的同時將下標為high的數組元素依次與劃分基準值key進行比較操作,直到high不大於low或找到第一個小於基準值key的數組元素,然後將該值賦值給low所指向的數組元素,同時將low右移一個位置。
如果low依然小於high,那麼由low所指向的數組元素開始向右掃描,掃描的同時將下標為low的數組元素值依次與劃分的基準值key進行比較操作,直到low不小於high或找到第一個大於基準值key的數組元素,然後將該值賦給high所指向的數組元素,同時將high左移一個位置。
重復步驟(3) (4),直到low的植不小於high為止,這時成功劃分後得到的左右兩部分分別為A[low……pos-1]和A[pos+1……high],其中,pos下標所對應的數組元素的值就是進行劃分的基準值key,所以在劃分結束時還要將下標為pos的數組元素賦值 為 key。