冒泡排序
#include <iostream>
#include <vector>
using namespace std;
void bubblesort(int n,vector<int>& ve){
for(int i=1;i<=n;i++){
int sp=0;
for(int j=n;j>=i;j--){
if(ve[j]<ve[j-1]) {
swap(ve[j], ve[j - 1]);
sp = 1;
}
}
if(sp==0)
break;
}
}
int main(){
vector<int> ve(10,0);
for(int i=0;i<10;i++){
cin>>ve[i];
}
bubblesort(10,ve);
for(int v:ve){
cout<<v<<" ";
}
return 0;
}
快速排序
1.选取基准元素
2.划分
3.递归
#include <iostream>
#include <vector>
using namespace std;
//选取基准
int FindPivot(vector<int>& ve,int left,int right){
return ve[left];
}
int Patition(vector<int>& ve,int left,int right,int pivot){
int l=left,r=right;
while(l<r){
while(l<r&&ve[r]>=pivot) r--;
if(l<r) ve[l]=ve[r];
while(l<r&&ve[l]<pivot) l++;
if(l<r) ve[r]=ve[l];
}
ve[l]=pivot;
return l;
}
void quicksort(vector<int>& ve,int left,int right){
if(left>=right)
return;
int key=FindPivot(ve,left,right);
int k=Patition(ve,left,right,key);
quicksort(ve,left,k);
quicksort(ve,k+1,right);
}
int main(){
vector<int> ve(10,0);
for(int i=0;i<10;i++){
cin>>ve[i];
}
quicksort(ve,0,10);
for(int v:ve){
cout<<v<<" ";
}
}
直接选择排序
#include <iostream>
#include <vector>
using namespace std;
void SelectSort(vector<int>& ve,int n){
int LowValue,LowIndex;
for(int i=0;i<n;i++){
LowValue=ve[i];
LowIndex=i;
for(int j=i+1;j<n;j++){
if(ve[j]<ve[i]){
LowIndex=j;
LowValue=ve[j];
}
}
swap(ve[i],ve[LowIndex]);
}
}
int main(){
vector<int> ve(10,0);
for(int i=0;i<10;i++){
cin>>ve[i];
}
SelectSort(ve,10);
for(int v:ve){
cout<<v<<" ";
}
}
堆排序
待排序的记录序列–>完全二叉树–>堆(初始建堆)–>按关键字有序的记录序列
#include <iostream>
#include <vector>
using namespace std;
void PushDown(vector<int>& ve,int first,int last){
if(first==last)
return;
int r=first;
while(r<=(last-1)/2){
//r只有一个儿子,且这个儿子是左儿子
if(r==(last-1)/2&&(last-1)%2==0){
if(ve[r]>ve[2*r+1])
swap(ve[r],ve[2*r+1]);
r=last;
}else if(ve[r]>ve[2*r+2]&&ve[2*r+2]<ve[2*r+1]){//有两个儿子的情况
swap(ve[r],ve[2*r+2]);
r=2*r+2;
}else if(ve[r]>ve[2*r+1]&&ve[2*r+1]<ve[2*r+2]){
swap(ve[r],ve[2*r+1]);
r=2*r+1;
} else //已经是最小堆
r=last;
}
}
void HeapSort(vector<int>& ve,int n){
for(int i=(n-1)/2;i>=0;i--){
PushDown(ve,i,n-1);
}
for(int i=n-1;i>=1;i--){
swap(ve[0],ve[i]);
PushDown(ve,0,i-1);
}
}
int main(){
vector<int> ve(10,0);
for(int i=0;i<10;i++){
cin>>ve[i];
}
HeapSort(ve,10);
for(int v:ve){
cout<<v<<" ";
}
}
插入排序
void InsertSort(vector<int>& ve,int n){
for(int i=1;i<n;i++){
int j=i;
while(j>0&&ve[j]<ve[j-1]){
swap(ve[j],ve[j-1]);
j--;
}
}
}
int main(){
vector<int> ve(10,0);
for(int i=0;i<10;i++){
cin>>ve[i];
}
InsertSort(ve,10);
for(int v:ve){
cout<<v<<" ";
}
}
希尔排序
#include <iostream>
#include <vector>
using namespace std;
void ShellSort(vector<int>& ve,int n){
for(int d=n/2;d>=1;d=d/2){
for(int i=d;i<n;i++){
int tmp=ve[i];
int j=i-d;
while(j>=0&&tmp<ve[j]){
ve[j+d]=ve[j];
j=j-d;
}
ve[j+d]=tmp;
}
}
}
int main(){
vector<int> ve(11,0);
for(int i=0;i<11;i++){
cin>>ve[i];
}
ShellSort(ve,11);
for(int v:ve){
cout<<v<<" ";
}
}
归并排序(二路)
#include <iostream>
#include <vector>
using namespace std;
void Merge(vector<int>& A,int low,int mid,int high){
int l=low;
int r=mid+1;
vector<int> B;
while(l<=mid&&r<=high){
if(A[l]<A[r])
{
B.push_back(A[l]);
l++;
}else{
B.push_back(A[r]);
r++;
}
}
while(l<=mid) B.push_back(A[l++]);
while(r<=high) B.push_back(B[r++]);
int k=0;
for(int i=low;i<=high;i++){
A[i]=B[k++];
}
}
void MergeSort(vector<int>& ve,int low,int high){
int mid =(low+high)/2;
if(low<high){
MergeSort(ve,low,mid);
MergeSort(ve,mid+1,high);
Merge(ve,low,mid,high);
}
}
int main(){
vector<int> ve(10,0);
for(int i=0;i<10;i++){
cin>>ve[i];
}
MergeSort(ve,0,9);
for(int v:ve){
cout<<v<<" ";
}
}