生活随笔
收集整理的這篇文章主要介紹了
纯手打常见基础排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
冒泡排序
相鄰的比較,復合條件就交換,需要走n-1趟
時間復雜度O(n^2)
#include<bits/stdc++.h>
using namespace std
;
const int N
=10005;
int main(){int n
;cin
>>n
;int a
[N
];for(int i
=1;i
<=n
;i
++)cin
>>a
[i
];for(int i
=1;i
<n
;i
++)for(int j
=1;j
<=n
-i
;j
++)if(a
[j
]>a
[j
+1]) swap(a
[j
],a
[j
+1]);for(int i
=1;i
<=n
;i
++)cout
<<a
[i
]<<' '; return 0;
}
選擇排序
每次選出最小值放在前面
時間復雜度O(n^2)
#include<bits/stdc++.h>
using namespace std
;
const int N
=10005;
int main(){int n
;cin
>>n
;int a
[N
];for(int i
=1;i
<=n
;i
++)cin
>>a
[i
];for(int i
=1;i
<n
;i
++)for(int j
=i
+1;j
<=n
;j
++){int min
=i
;if(a
[min
]>a
[j
]) min
=j
;swap(a
[i
],a
[min
]);}for(int i
=1;i
<=n
;i
++)cout
<<a
[i
]<<' ';return 0;
}
插入排序
時間復雜度O(n^2)
#include<bits/stdc++.h>
using namespace std
;
const int N
=10005;
int main(){int n
;cin
>>n
;int a
[N
];for(int i
=1;i
<=n
;i
++)cin
>>a
[i
];for(int i
=1;i
<=n
;i
++){int key
=a
[i
];int j
=i
-1;while((j
>=1)&&a
[j
]>key
){a
[j
+1]=a
[j
];j
--;}a
[j
+1]=key
;} for(int i
=1;i
<=n
;i
++)cout
<<a
[i
]<<' ';return 0;
}
快速排序
選出一個基數,大于基礎的放右邊,小于基數的放左邊
快速排序的優點在于: 對于 規模大且無序 的數組具有非常高的效率
時間復雜度O(nlogn)
#include<bits/stdc++.h>
using namespace std
;
const int N
=10005;
void quick_sort(int a
[],int l
,int r
){if(l
>=r
)return;int i
=l
-1,j
=r
+1,x
=a
[l
+r
>>1];while(i
<j
){do{i
++;}while(a
[i
]<x
);do{j
--;}while(a
[j
]>x
);if(i
<j
)swap(a
[i
],a
[j
]); } quick_sort(a
,l
,j
);quick_sort(a
,j
+1,r
);
}
int main(){int n
;cin
>>n
;int a
[N
];for(int i
=1;i
<=n
;i
++)cin
>>a
[i
];quick_sort(a
,1,n
);for(int i
=1;i
<=n
;i
++)cout
<<a
[i
]<<' ';return 0;
}
歸并排序
本質是: 兩個有序數組的合并
時間復雜度 O(nlogn)
#include<bits/stdc++.h>
using namespace std
;
const int N
=100005;
int tmp
[N
];
void merge_sort(int q
[], int l
, int r
)
{if (l
>= r
) return;int mid
= l
+ r
>> 1;merge_sort(q
, l
, mid
);merge_sort(q
, mid
+ 1, r
);int k
= 0, i
= l
, j
= mid
+ 1;while (i
<= mid
&& j
<= r
)if (q
[i
] <= q
[j
]) tmp
[k
++ ] = q
[i
++ ];else tmp
[k
++ ] = q
[j
++ ];while (i
<= mid
) tmp
[k
++ ] = q
[i
++ ];while (j
<= r
) tmp
[k
++ ] = q
[j
++ ];for (i
= l
, j
= 0; i
<= r
; i
++, j
++ ) q
[i
] = tmp
[j
];
}
int main(){int n
;cin
>>n
;int a
[N
];for(int i
=1;i
<=n
;i
++)cin
>>a
[i
];merge_sort(a
,1,n
);for(int i
=1;i
<=n
;i
++)cout
<<a
[i
]<<' ';return 0;
}
堆排序
堆的本質就是一個完全二叉樹,只不過哦滿足特殊的要求
1. 大頂堆: 每一個 父節點 >= 子節點
2. 小頂堆: 每一個父節點 <= 子節點
根據這一特性,可以使用堆的性質來對元素進行排序
時間復雜度O(nlogn)
步驟:
1.從a[n/2] 到a[1] ,不斷調整,每個分支結點與其孩子的值,使其滿足大頂堆的性質
2.堆排序:
(1) 頭尾交換 堆的長度減1
(2) 把"新堆"調整為大頂堆
(3)循環以上兩步,直到只剩下對頂元素
#include<bits/stdc++.h>
using namespace std
;
const int N
= 100005;
int a
[N
];
void adjust_heap(int a
[] , int i
, int len
){for( i
= i
* 2 ; i
<= len
; i
*= 2){if(i
< len
&& a
[i
] < a
[i
+1])i
++ ;if(a
[i
] > a
[i
/2])swap(a
[i
], a
[i
/2]);elsebreak; }
}
int main(){int n
; cin
>> n
;for(int i
= 1; i
<= n
; i
++) cin
>> a
[i
] ;for(int i
= n
/2;i
>= 1; i
--)adjust_heap(a
,i
,n
) ;cout
<< endl
;for(int i
= n
; i
>= 2; i
--){swap(a
[1],a
[i
]);adjust_heap(a
,1,i
-1);}
for(int i
= 1; i
<= n
; i
++) cout
<< a
[i
] << ' ';
}
我們常用的 priority_queue的底層實現就是堆,因此可以使用priority_queue來模擬堆排序,但是效率較數組模擬較差
總結
以上是生活随笔為你收集整理的纯手打常见基础排序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。