主要運用到的的思想:分治、遞迴
功能:1.陣列進行排序。
2.計算陣列中的逆序對的個數。
時間複雜度:穩定的o(nlogn)
空間複雜度:o(n)
附上模板**:
#
include
using
namespace std;
long
long
merge
(int a,
int b,
int s,
int m,
int e)
}while
(i<=m)
b[k++
]=a[i++];
while
(j<=e)
b[k++
]=a[j++];
for(
int n=s;n<=e;n++
) a[n]
=b[n]
;return ans;
}void
mergesort
(int a,
int b,
int s,
int e)
}int a[
100005];
int b[
100005];
intmain()
mergesort
(a,b,
1,n)
;for
(int i=
1;i<=n;i++
)return0;
}
主要思想:不斷交換相鄰兩個逆序的元素。最終將最大排在最後,類似於可樂冒泡。
時間複雜度:o(n²)
空間複雜度:o(n)
#
include
using
namespace std;
void
bubblesort
(int a,
int n)}}
}int a[
100005];
intmain()
bubblesort
(a,n)
;for
(int i=
1;i<=n;i++
)return0;
}
主要思想:通過與n次(n為陣列的長度)的選擇,可以將每次當前為選擇的最大(最小)的元素放在相應位置上。
時間複雜度:o(n²)
空間複雜度:o(n)
#
include
using
namespace std;
void
selectsort
(int a,
int n)
}int t=a[min]
; a[min]
=a[i]
; a[i]
=t;}
return;}
int a[
100005];
intmain()
selectsort
(a,n)
;for
(int i=
1;i<=n;i++
)return0;
}
主要思想:兩層for迴圈,第一層表示接下來要將前i個排好序,第二個for迴圈,用於通過比較判斷第i個元素應該放在1~i的哪個位置上
時間複雜度:o(n²)
空間複雜度:o(n)
#
include
using
namespace std;
void
insertsort
(vector<
int>
&a,int len)
else}}
return;}
intmain()
insertsort
(a,n)
;for
(int i=
0; i++i)
return0;
}
主要思想:可以認為是插入排序的plus版,內部多了有個增量因子(i=3*i+1),作為每輪插入排序中第二個for『迴圈每次結束後的增加量
時間複雜度:o(n^1.5)左右
空間複雜度:o(n)
#
include
using
namespace std;
typedef
long
long ll;
const
int maxn =
100005
;int a[maxn]
,n;void
insertionsort
(int a,
int n,
int g)
else
break;}
a[j+g]
=temp;}}
void
shellsort
(int a,
int n)
for(
int i=g.
size()
-1;i>=
0;i--)}
intmain()
shellsort
(a,n)
;for
(int i=
1;i<=n;i++
)return0;
}
ACM 歸併排序
descript 歸併排序 author chenzx include using namespace std const int n 7 void print arry int arry,int len else 2.將剩餘的部分新增到臨時陣列中 while first1 mid while fi...
基本演算法 歸併排序
歸併排序 是一種較穩定的排序演算法 時間複雜度 nlogn 基本思想 將乙個陣列進行拆分成兩兩一組,然後分別對每組進行排序組合。基本演算法 將有二個有序數列a first.mid 和a mid.last 合併。void mergearray int a,int first,int mid,int l...
基本排序演算法 歸併排序詳解
歸併排序的核心就是將待排序元素先不斷分割直至不可分割,然後左右合併歸一。本質上是分治和遞迴的使用。話不多說,直接上 include includeusing namespace std class solution else 迴圈結束表示某乙個走完了,剩下的直接放入尾部 while i mid wh...