幾種常見的排序演算法(C

2021-07-23 14:26:37 字數 3454 閱讀 4087

說到排序,網上一搜就有一大堆的部落格資料,涵蓋各種語言實現,而許多演算法書中更是寫的很詳細,寫此部落格只是記錄下所敲的這幾行**,以便日後檢視。

直接貼domo:

#ifndef  	sort_h

#define sort_h

#include

#include

using namespace std;

template

class sort

;template

void sort::

bubblesort

(t *array,

const

int length)

//氣泡排序}}

template

void sort::

selectsort

(t *array,

const

int length)

//選擇排序 }}

} template

void sort::

insertsort

(t *array,

const

int length)

//插入排序

array[j]

=temp;

//空出來就是要插入的位置 }}

template

void sort::

quicksort

(t *array,

int left,

int right)

//快速排序

array[i]

=baseval;

quicksort

(array,left,i-1)

;quicksort

(array,j+

1,right);}

} template

void sort::

shellsort

(t *array,

const

int length)

//希爾排序

array[k+gap]

=temp;

//插入的位置 }}

}}}template

void sort::

mergearray

(t array,

int first,

int mid,

int last, t temp)

while

(i <= m)

temp[k++

]= array[i++];

while

(j <= n)

temp[k++

]= array[j++];

for(i =

0; i < k; i++

) array[first + i]

= temp[i];}

template

void sort::

merge

(t array,

int first,

int last,t temp)

//歸併排序

}/**

二叉堆是完全二叉樹或者是近似完全二叉樹。

二叉堆滿足二個特性:

1.父結點的鍵值總是大於或等於(小於或等於)任何乙個子節點的鍵值。

2.每個結點的左子樹和右子樹都是乙個二叉堆(都是最大堆或最小堆)。

i結點的父結點下標就為(i – 1) / 2

它的左右子結點下標分別為2 * i + 1和2 * i + 2

**/template

void sort::

minheapifix

(t *array,

int i,

int heapsize)

// array[i]=temp;

for(

int n =

(heapsize-1)

/2;n>=i;n--)}

template

void sort::

makeminheap

(t *array,

int heapsize)

//建立最小堆

template

void sort::

heapsort

(t *array,

const

int length)

//堆排序 }

template

void sort::

display

(t *array,

const

int length)

}#endif

以上**,在本地都跑過了,以下是驗證**:

#include

#include

"sort.h"

using namespace std;

intmain()

;//;

int array[10]

;const

int length =10;

sort<

int>

*sort = new sort<

int>()

; sort->

display

(testarray,length)

; cout<

"after sort: "

<

// sort->bubblesort(testarray,length); //氣泡排序

// sort->selectsort(testarray,length); //選擇排序

// sort->insertsort(testarray,length); //插入排序

// sort->quicksort(testarray,0,9);

/******堆排序*****/

// sort->makeminheap(testarray,length);

// sort->heapsort(testarray,length);

/********/

// sort->shellsort(testarray,length);

sort->

merge

(testarray,0,

9,array)

; sort->

display

(testarray,length)

; delete sort;

sort =

null

;return0;

}

關於時間複雜度o的比較和穩定性分析:

1.以上**的思路參考自博主morewindows的白話經典演算法

2.此外還有慕課網的這篇文章。傳送門

常見幾種排序演算法的C 描述

注意如果採取的是三數中值分割法的時候需要,將頭,中,尾的三個值中間的轉移到陣列的頭部。這樣來進行partition void quicksort vector arr,int start,int end void bubblesort vector arr void shellsort vector...

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

一 選擇排序 演算法思想 對於有n個元素的陣列,一共有n躺排序,每趟排序要保證前i ii項元素已經排好序,對於第i ii趟排序,從第i ii個元素開始遍歷陣列,將當前遍歷元素中最小的值與第i個元素交換。具體 實現如下 include include include using namespace s...

幾種常見排序演算法

幾種常見排序演算法 1氣泡排序 bubble sort 氣泡排序思路 將序列當中的左右元素,依次比較,保證右邊的元素始終大於左邊的元素 第一輪結束後,序列最後乙個元素一定是當前序列的最大值 對序列當中剩下的n 1個元素再次執行步驟1。3.對於長度為n的序列,一共需要執行n 1輪比較 實現 for i...