內部排序演算法彙總

2021-10-03 20:31:23 字數 4248 閱讀 2277

3.快速排序

4.選擇排序

5.歸併排序o(nlogn)

6.桶排序

7.各個排序演算法比較

大部分演算法中,待排記錄的資料型別設為:

#define maxsize 20  

//乙個用作示例的小順序表的最大長度

typedef

int keytype;

//定義關鍵字型別為整數型別

typedef

struct

redtype;

typedef

struct

sqlist;

//順序表型別

void

insertsort

(sqlist& l)}}

}

void

shellinsert

(sqlist& l,

int dk)}}

}void

shellsort

(sqlist& l)

}

void

bubblingsort

(sqlist& l)}}

}

int i,j

for(i=

0;i++i)

for(j=i+

1;j++j)

這樣的演算法時間複雜度達到了o(nn),我們嘗試另一種思路,利用兩個指標,乙個指向首部記為i,乙個指向尾部記為j,如果它們指向的和小於m,則i++,大於m則j–,否則輸出並且i++,j–,直到i==j,**如下:

while

(ielse

if(a[i]

+a[j]

< m)

++i;

else

--j;

}

上述演算法的時間複雜度為o(n),可以發現two pointers思想充分利用了序列遞增的性質,面對一些有序序列的遍歷操作很有用。還比如兩個有序序列的合併,歸併排序,和現在需要解決的快速排序。

int

partition

(sqlist& l,

int low,

int high)

l.r[low]

.key = zhou.key;

return low;

}void

qsort

(sqlist& l,

int low,

int high)

}void

quicksort

(sqlist& l)

快速排序的平局時間為t = knlnn,其中n為待排序序列記錄的個數,k為某個常數,時間複雜度為o(nlogn),就平均時間而言,快速排序是目前被認為是最好的一種內部排序方法

void

selectsort

(sqlist& l)

} redtype tmp = l.r[i]

; l.r[i]

= l.r[index]

; l.r[index]

= tmp;

}}

首先解決第二個問題:通過篩選解決,篩選就是自堆頂至葉子的調整過程。

再看第乙個問題:從無序序列建堆的過程就是乙個反覆「篩選」的過程。若將此序列看成是乙個完全二叉樹,則最後乙個非終端結點是⌊n/2⌋個元素,由此「篩選」只需從第⌊n/2⌋個元素開始。

堆排序演算法:

注意:堆排序下標要從1開始,因為如果從0開始的話得不到根結點的子節點

typedef sqlist heaptype;

void

heapadjust

(heaptype& h,

int s,

int m)

h.r[s]

= rc;

}void

heapsort

(heaptype& h)

}

void

merge

(const redtype _tr[

],redtype tr,

int s,

int mid,

int t)

while

(i<=mid)

tr[k++

]= _tr[i++];

while

(j<=t)

tr[k++

]= _tr[j++];

}void

msort

(const redtype sr[

], redtype tr,

int s,

int t)

}void

mergesort

(sqlist& l)

舉個例子, nums=[2, 1, 3, 1, 5] , 首先掃瞄一遍獲取最小值和最大值, maxvalue=5 , minvalue=1 ,於是開乙個長度為5的計數器陣列 counter ,

void

countsort

(sqlist& l)

int size = max - min +1;

int* tmp =

(int*)

malloc

(sizeof

(int

)* size)

;memset

(tmp,

0, size*

sizeof

(int))

;for

(int i =

0; i < l.length;

++i)

//輸出

for(

int i =

0; i < size;

++i)

delete tmp;

}

void

better_countsort

(sqlist& l)

int size = max - min +1;

int* tmp =

(int*)

malloc

(sizeof

(int

)* size)

;memset

(tmp,

0, size*

sizeof

(int))

;for

(i =

0; i < l.length;

++i)

++tmp[l.r[i]

.key - min]

;//求新的tmp

for(i =

0; i < size-1;

++i)

tmp[i +1]

+= tmp[i]

; redtype* sortedarray =

(redtype*

)malloc

(sizeof

(redtype)

* l.length)

;for

(i = l.length -

1; i >=0;

--i)

//回賦值給原序列

for(i =

0; i < l.length;

++i)

l.r[i]

= sortedarray[i]

;delete tmp;

}

void

better_countsort

(sqlist& l,

int exp)

//回賦值給原序列

for(i =

0; i < l.length;

++i)

l.r[i]

= sortedarray[i]

;delete tmp;

}void

radixsort

(sqlist& l)

內部排序彙總

最近在複習各種內部排序演算法,照著書上的偽 敲了一遍,排序演算法實現本來不難,主要理解每種演算法的思路和複雜度以及穩定性。源 include include define n 150 include void insertsort int a a j 1 a 0 void shellsort int...

內部排序彙總

直接插入排序 直接插入排序 void insertsort int a,int n if flag false 快速排序 參考之前文章 快速排序 一趟快速排序,劃分 int partition int a,int low,int high else a start a 0 被篩選結點的值放入最終位置...

內部排序演算法

內部排序是指待排序列完全存放在記憶體中所進行的排序過程,適合不太大的元素序列。1.快速排序int partition int a,int low,int high a low a high while low2.並歸排序 void merging int list1,int list1 size,i...