常見的7種排序演算法

2022-08-10 09:09:09 字數 3374 閱讀 1421

1、氣泡排序

最簡單的一種排序演算法。先從陣列中找到最大值(或最小值)並放到陣列最左端(或最右端),然後在剩下的數字中找到次大值(或次小值),以此類推,直到陣列有序排列。演算法的時間複雜度為o(n^2)。

// 氣泡排序

void bubblesort(int arr, int length)}}

}2、選擇排序

嚴蔚敏版《資料結構》中對選擇排序的基本思想描述為:每一趟在n-i+1(i=1,2,...,n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。具體來說,假設長度為n的陣列arr,要按照從小到大排序,那麼先從n個數字中找到最小值min1,如果最小值min1的位置不在陣列的最左端(也就是min1不等於arr[0]),則將最小值min1和arr[0]交換,接著在剩下的n-1個數字中找到最小值min2,如果最小值min2不等於arr[1],則交換這兩個數字,依次類推,直到陣列arr有序排列。演算法的時間複雜度為o(n^2)。

// 選擇排序

void selectionsort(int arr, int length)

}if (index == i)

continue;

else}}

3、插入排序

插入排序的基本思想就是將無序序列插入到有序序列中。例如要將陣列arr=[4,2,8,0,5,1]排序,可以將4看做是乙個有序序列(圖中用藍色標出),將[2,8,0,5,1]看做乙個無序序列。無序序列中2比4小,於是將2插入到4的左邊,此時有序序列變成了[2,4],無序序列變成了[8,0,5,1]。無序序列中8比4大,於是將8插入到4的右邊,有序序列變成了[2,4,8],無序序列變成了[0,5,1]。以此類推,最終陣列按照從小到大排序。該演算法的時間複雜度為o(n^2)。

// 插入排序

void insertsort(int arr, int length)

arr[j + 1] = temp;}}

}4、希爾排序

希爾排序(shell's sort)在插入排序演算法的基礎上進行了改進,演算法的時間複雜度與前面幾種演算法相比有較大的改進。其演算法的基本思想是:先將待排記錄序列分割成為若干子串行分別進行插入排序,待整個序列中的記錄"基本有序"時,再對全體記錄進行一次直接插入排序。

// 插入排序

void shellsort(int arr, int length)

arr[k + increasement] = temp;}}

}} while (increasement > 1);

}5、快速排序

快速排序的基本思想是:通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續進行排序,已達到整個序列有序。一趟快速排序的具體過程可描述為:從待排序列中任意選取乙個記錄(通常選取第乙個記錄)作為基準值,然後將記錄中關鍵字比它小的記錄都安置在它的位置之前,將記錄中關鍵字比它大的記錄都安置在它的位置之後。這樣,以該基準值為分界線,將待排序列分成的兩個子串行。

一趟快速排序的具體做法為:設定兩個指標low和high分別指向待排序列的開始和結尾,記錄下基準值baseval(待排序列的第乙個記錄),然後先從high所指的位置向前搜尋直到找到乙個小於baseval的記錄並互相交換,接著從low所指向的位置向後搜尋直到找到乙個大於baseval的記錄並互相交換,重複這兩個步驟直到low=high為止。

// 快速排序

void quicksort(int arr, int start, int end)

if (i < j)

// 從左向右找比基準數大的數

while (i < j && arr[i] < baseval)

if (i < j)

}// 把基準數放到i的位置

arr[i] = baseval;

// 遞迴

quicksort(arr, start, i - 1);

quicksort(arr, i + 1, end);

}6、歸併排序

「歸併」的含義是將兩個或兩個以上的有序序列組合成乙個新的有序表。假設初始序列含有n個記錄,則可以看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到(表示不小於x的最小整數)個長度為2(或者是1)的有序子串行,再兩兩歸併。如此重複,直到得到乙個長度為n的有序序列為止。這種排序方法稱為2-路歸併排序。

// 歸併排序

void mergesort(int arr, int start, int end, int * temp)

else

}while (i_start <= i_end)

while (j_start <= j_end)

// 把輔助空間的資料放到原空間

for (int i = 0; i < length; i++)

}7、堆排序

堆的定義如下: n個元素的序列當且僅當滿足一下條件時,稱之為堆。

可以將堆看做是乙個完全二叉樹。並且,每個結點的值都大於等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於等於其左右孩子結點的值,稱為小頂堆。

堆排序(heap sort)是利用堆進行排序的方法。其基本思想為:將待排序列構造成乙個大頂堆(或小頂堆),整個序列的最大值(或最小值)就是堆頂的根結點,將根節點的值和堆陣列的末尾元素交換,此時末尾元素就是最大值(或最小值),然後將剩餘的n-1個序列重新構造成乙個堆,這樣就會得到n個元素中的次大值(或次小值),如此反覆執行,最終得到乙個有序序列。

/*@param arr 待調整的陣列

@param i 待調整的結點的下標

@param length 陣列的長度

*/void heapadjust(int arr, int i, int length)

if (rchild < length && arr[rchild] > arr[max])

// 若i處的值比其左右孩子結點的值小,就將其和最大值進行交換

if (max != i)

}// 堆排序

void heapsort(int arr, int length)

// 交換堆頂元素和最後乙個元素

for (int i = length - 1; i >= 0; i--)

}

7種常見排序演算法的c 實現

今天心血來潮複習了一下基本的排序演算法,實現了一下,就順便發上來咯。在 裡做了注釋了 也就不多說了,直接上 吧。order algorithm.cpp 定義控制台應用程式的入口點。author netbin include stdafx.h include iostream include incl...

八種常見的排序演算法

演算法 穩定性時間複雜度 計數排序 穩定o n 基數排序 穩定o n 桶排序不穩定 o n 插入排序 穩定o n 2 歸併排序 穩定o nlogn 快速排序 不穩定o nlogn 希爾排序 不穩定o n 2 堆排序不穩定 o nlogn include include using namespace...

八種常見的演算法排序

一 排序演算法的分類 列舉7種 1.氣泡排序 2.選擇排序 3.插入排序 4.快速排序 5.歸併排序 歸併排序需要額外的記憶體空間來儲存資料,其他的方式都是在原來資料上做交換 6.希爾排序 7.堆排序 1 最基礎的排序 氣泡排序 時間複雜度是 o n 2 設無序陣列a長度為n,以由小到大排序為例。冒...