C 各種常見排序演算法

2021-08-03 20:07:09 字數 3321 閱讀 6097

<1>氣泡排序的本質在於每一趟迴圈從陣列的頭走到尾找到最大的值放在最右邊,下一次迴圈繼續從剩下的n-1個數中尋找最大值放到最右邊。直到剩下最後倆個數比較交換後結束。

<2>比較方式也簡單易懂,拿公升序為例,用a[i]與a[i+1]比較,如果a[i]>a[i+1],swap(a[i],a[i+1]),當然,如果10個數進行排序,比較九次就可以確定這十個數中的最大值。簡單的**實現如下:

void bubblesort(int* a,int size) }

<1>插入排序的思想自然就是以插入為主,當然最主要的排序思路必然是先單趟再進行迴圈,第一步先掌握單趟排序的過程。插入排序每一趟將當前位置的數調整到新的有序序列當中。

<2>如果倆個數進行排序,以公升序為例 2 , 1 用第乙個數與第二個數進行比較,實現儲存好第二個位置的值 temp=a[end+1],將大的值賦給a[second],如果事先沒有存好第二個位置的值的話此時就找不到原本第二個位置的值了。接下來要做的自然就是a[end]=temp, 這樣就完成了倆個數的排序。

<3>但是多個數進行排序的時候如:3,4,5,1,2 進行排序的時候,當進行到第三個數的時候,此時i=end=2,當 2 與 1 交換以後,–end,end<0時迴圈結束,整個過程就是,1與5比較以後1到了5的位置,1再與4進行比較交換,再與3 進行比較交換,此時end<0,迴圈結束,完成這一趟排序。

<4>由上可知,我們需要進行n-1躺上述排序,整體**如下:

void insertsort(int*a, int size)//插入排序

else }

a[end + 1] = temp;

}
<1>希爾排序像是插入排序的公升級版本,主要用來出來數量龐大元素之間的排序。將需要排序的物件先排序為gap個數為一組的有序的序列,初始值為n,逐漸減小gap值,當gap為1時,自然就和插入排序一樣了。

<2>通常我們將gap=gap/3+1,所以當gap為1時達到排序目的。

<3>需要理解的是外層迴圈條件的控制,插入排序相當於gap為1,自然就是n-1次,也就是n-gap次。因為要分割為每個組為gap個數的多個有序序列,所以a[end]應與a[end+gap]進行比較。**如下:

void shellsort(int*a, int size)//希爾排序

else

a[end + gap] = temp;

} } } }

<1>選擇排序的重點自然是在於如何選擇,其單趟排序完成當前序列最大值與最小值的放置。

<2>我們定義倆個變數min,max用來存放實時的最小值與最大值,等到一便走完以後分別將其放到a[left]與a[right],left++,right–,直到left,與right相遇後比較結束,完成排序,**如下:

void selectsort(int*a, int size)//選擇排序

if (a[i]>a[max])

}swap(a[left], a[min]);

if (max == left)/*如果left位置確定為最大值,上面的交換將其換到了最小值的位置,特做以下處理。*/

swap(a[max], a[right]);

left++;

right--;

}<1>利用堆進行排序,自然首先要建堆。公升序鍵大堆,降序建小堆。建堆的過程需要調整演算法,調整次數取決與最後乙個非葉結點的位置。pos=(n-2)/2,也是從這個位置開始調整,直至根節點完成建堆。

<2>堆頂資料自然是堆中最大的數,將它與最後乙個位置的值進行交換,再進行一次調整,對前n-1個數進行調整。持續這個過程直至n小於0.**如下:

void adjustdown(int*a, int size, int root)

else

break;

}} void heapsort(int *a, int size) }

<1>快速排序是我們最常用到的適用面也比較廣泛的排序方法,其思想是每次以陣列中的乙個key值為分割點,使左邊值小於它,右邊值大於它。分為倆部分以後轉變為子問題在進行分割,直到變為剩下乙個值的有序空間。

<2>所以快速排序的關鍵在於如何進行分割,我們通常取陣列最後乙個位置的資料為key值,當然要是這個位置的值最大或最小的話就降低效率了,也可以取隨機數,或者用三數取中法使快排時間複雜度控制在nlgn。

<3>獲取key值並進行第一趟排序有三種方式分別為左右指標法、挖坑法以及倆個指標尾隨法。

①左右指標:取key=a[right],左邊從left開始,右邊從right開始,分別與key值比較,左邊遇到比key大的停下來,右邊開始走,遇到比key小的停下來a[begin]與a[end]交換。走到迴圈結束a[begin]或a[end]與a[right]進行交換,完成第一趟排序。

②挖坑法:取key=a[right],同樣a[begin]往後走遇到比key值大的停下來,a[end]=a[begin];a[end]往前走遇到比key值小的停下來,a[begin]=a[end],迴圈結束,a[begin]=key,完成第一趟排序。

③倆個指標尾隨法:取key=a[right],cur=left,prev=left-1,cur遇到比key值小的,prev++,cur++,遇到比key值大的停下來如果++prev!=cur,swap(a[cur],a[++prev]),否則cur++,直至cur=right,swap(a[prev],a[right]),完成第一趟排序。

<4>接受單趟排序返回值,進行遞迴呼叫,**如下:

int sort2(int* a, int left, int right)//倆個指標法

++cur;

}

swap(a[right], a[++prev]);

return prev;

}

int sort1(int*a, int left,int right)//挖坑法

a[end] = a[begin];

while (begin < end && a[end] >= key)

a[begin] = a[end];

} a[begin] = key;

return begin; } }

int sort3(int*a, int left, int right)//左右指標法

else }

while (begin1 <= end1)

while (begin2 <= end2)

memcpy(a + pos, temp + pos, sizeof(int)*(end2 - pos + 1));

}void _mergesort(int *a, int*temp, int left, int right)

void mergesort(int*a, int size)

各種常見排序演算法

選擇排序 private static int selectsort int a return a 氣泡排序 private static int bubblesort int a return a 希爾排序 private static int shellsort int a while h 1 ...

各種常見排序演算法實現

將各種常見排序演算法簡單實現了一下,包括 1 簡單插入排序 2 氣泡排序 3 簡單選擇排序 4 快速排序 5 希爾排序 6 堆排序 7 歸併排序 如下 include include include define len 10 初始化陣列 void init int arr,int len 列印陣列...

C 各種排序演算法

public class sorter 插入排序法 public static void insertionsort int list list j t 選擇排序法 public static void selectionsort int list int t list min list min l...