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...