冒泡排序
#include<iostream>
#include<bits\stdc++.h>
using namespace std;
int a[100];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1]) swap(a[j],a[j+1]);
}
}
for(int i=0;i<n;i++) cout<<a[i]<<" ";
}
选择排序
#include<iostream>
#include<bits\stdc++.h>
using namespace std;
int a[100];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n-1;i++)
{
int u=i;
for(int j=i+1;j<n;j++)
{
if(a[j]<a[u])
{
u=j;
}
}
swap(a[i],a[u]);
}
for(int i=0;i<n;i++) cout<<a[i]<<" ";
}
插入排序
#include<iostream>
#include<bits\stdc++.h>
using namespace std;
int a[100];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++)
{
int j;
//第一次犯得错
//5 3 1 7 6 8
//3 3 7 7 8
int k=a[i];//这里千万不能忘记,不然后面覆盖了就出问题。
for(j=i-1;j>=0;j--)
{
if(a[j]>a[i])
{
a[j+1]=a[j];
}
else
{
break;
}
}
a[j+1]=k;
}
for(int i=0;i<n;i++) cout<<a[i]<<" ";
}
分治思想:双指针+递归实现
快速排序
#include<iostream>
using namespace std;
int quick(int a[],int l,int r)
{
int temp=a[l];
while(l<r)
{
while(l<r&&a[r]>temp) r--;
a[l]=a[r];
while(l<r&&a[l]<temp) l++;
a[r]=a[l];
}
a[l]=temp;
return l;
}
//快速排序和归并排序都是先拆分,再排序,只不过归并排序多了一个归并的过程,而且拆分时不考虑大小顺序问题。
void quick_sort(int a[],int l,int r)
{
if(l<r)
{
int mid=quick(a,l,r);
quick_sort(a,l,mid-1);
quick_sort(a,mid+1,r);
}
}
int main()
{
int n;
cin>>n;
int a[10000];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
quick_sort(a,0,n-1);
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
}
归并排序
#include<bits/stdc++.h>
using namespace std;
void merge(int a[],int la,int ra,int lb,int rb)
{
int i=la,j=lb;
int temp[100000];
int index=0;
while(i<=ra&&j<=rb)
{
if(a[i]<=a[j])
{
temp[index++]=a[i++];
}
else
{
temp[index++]=a[j++];
}
}
while(i<=la) temp[index++]=a[i++];
while(j<=lb) temp[index++]=a[j++];
for(int i=0;i<index;i++)
{
a[la+i]=temp[i];
}
}
//先有序,再合并
void merge_sort(int a[],int l,int r)
{
if(l<r)
{
int mid=(r+l)/2;
merge_sort(a,l,mid);
merge_sort(a,mid+1,r);
merge(a,l,mid,mid+1,r);
}
}
int main()
{
int n;
cin>>n;
int a[10000];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
merge_sort(a,0,n-1);
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
}
堆排序
#include<iostream>
using namespace std;
void downAdjust(int a[],int low,int high)
{
while(low<high)
{
int j=low*2;//左孩子结点
if(j>high) break;
if(j+1<=high&&a[j]<a[j+1]) j+=1;//找到左右结点较大的一个
if(a[low]<a[j])
{
swap(a[low],a[j]);
low=j;
}
else break;
}
}
//大顶堆 ,数组要从1开始
void creatHeap(int a[],int n)
{
for(int i=n/2;i>=1;i--)
{
downAdjust(a,i,n);
}
}
void heapSort(int a[],int n)
{
creatHeap(a,n);
for(int i=1;i<n;i++)
{
swap(a[1],a[n-i+1]);
downAdjust(a,1,n-i);
}
}
int main()
{
int n;
cin>>n;
int a[10000];
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
heapSort(a,n);
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
}