排序分為記憶體排序和外部排序,內部排序在記憶體中進行,外部排序因資料量較大,在外存中進行。一般我們常說的八大排序為內部排序。
複雜度為o(nlog2n)的排序演算法:快速排序、堆排序和歸併排序。
1.1 演算法思想
每趟將乙個待排序的元素作為關鍵字,按照其關鍵字值的大小插入到已經排好的部分序列的適當位置上,插入時從後向前查詢合適位置,直到插入完成。
}又叫做縮小增量排序,其本質還是插入排序。此外,希爾排序不穩定。
4.1 演算法思想
首先第乙個記錄和第二個記錄比較,若前者較大,則兩者互換;否則,不交換。如此迴圈一次,則最大元素位於最後。第二次迴圈,第二大元素位於陣列倒數第二的位置。步驟如下。
注:在第二層迴圈中設定標誌位監視是否有元素發生交換,若無,直接返回。
4.2 **
void bubblesort(int a,int n)
} if(flag==0)
return;
}}
5.1 演算法思想一趟快速排序是以乙個「樞軸」為中心,將序列分成兩部分,一邊全是比它小的,另一邊全是比它大的。
注:用到了while迴圈與遞迴。
5.2 **
void quicksort(int a,int l,int r)
} temp = a[i];
a[i] = a[k];
a[k] = temp;
}}
堆排序是一種樹形選擇排序,是對簡單選擇排序的一種改進。
7.1 演算法思想
任何乙個非葉節點的值都不大於(或不小於)其左右孩子結點的值。若父親大孩子小,則這樣的堆叫做大頂堆;若父親小孩子大,稱為小頂堆。
由定義可知,代表堆的這棵完全二叉樹的根節點的值是最大(或最小)的,最後乙個元素與堆頂交換,替換後,有序序列元素增加1,無序序列元素減少1.
因此,堆排序需要解決兩個問題:
①如何將n個待排序的數建成堆。
②輸出堆頂元素後,如何調整剩餘n-1個元素,成為新堆。
首先討論第二個問題:輸出堆頂元素後,對剩餘n-1元素重新建成堆的調整過程。
調整小頂堆的方法:
1)設有m 個元素的堆,輸出堆頂元素後,剩下m-1 個元素。將堆底元素送入堆頂((最後乙個元素與堆頂進行交換),堆被破壞,其原因僅是根結點不滿足堆的性質。
2)將根結點與左、右子樹中較小元素的進行交換。
3)若與左子樹交換:如果左子樹堆被破壞,即左子樹的根結點不滿足堆的性質,則重複方法 (2).
4)若與右子樹交換,如果右子樹堆被破壞,即右子樹的根結點不滿足堆的性質。則重複方法 (2).
5)繼續對不滿足堆性質的子樹進行上述交換操作,直到葉子結點,堆被建成。
稱這個自根結點到葉子結點的調整過程為篩選。如圖:
建堆方法:對初始序列建堆的過程,就是乙個反覆進行篩選的過程。
1)n 個結點的完全二叉樹,則最後乙個結點是第
2)篩選從第
3)之後向前依次對各結點為根的子樹進行篩選,使之成為堆,直到根結點。
如圖建堆初始過程:無序序列:(49,38,65,97,76,13,27,49)
for(i=n;i>=2;--i)//進行n-1次迴圈完成堆排序
}演算法思想歸併(merge)排序法是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。
歸併排序示例:
資料結構中的排序演算法
參考自 大話資料結構 氣泡排序的基本思想是 兩兩比較相鄰記錄的關鍵字,如果反序則交換。注釋 n是陣列的長度,0,i 1 之間已經排好序,第乙個for迴圈是對當前的第i位排序,第二個for迴圈對 i,n 1 之間的相鄰的數進行排序,相鄰的逐一進行比較,使得小的逐漸向上交換 void bubblesor...
資料結構中的排序演算法總結
資料結構中的排序演算法 當待排序序列基本有序時優先選擇簡單排序,快速排序平均次數少於堆排序 1 插入排序 1 直接插入排序 第一次將位置0和位置1進行比較,小的放前。第二次將位置2上的數字,插入到位置0和位置1中。第k次將位置k上的數字,插入到第k 1次已經完成的序列中。52 6 0 3 9 1 7...
資料結構 排序演算法
include include define maxitem 100 typedef char keytype 5 typedef int elemtype typedef struct rec elemnode maxitem 氣泡排序演算法 void bubblesort elemnode r,...