选择排序
基本思想:先将n个数中最小的数与a[0]对换,再将剩下的数中最小的数与a[1]对换,每比较一轮,找出未经排序的数中最小的一个。
代码如下
#include<iostream>
using namespace std;
void sort(int arr[],int n)
{
int i,j,k;
for(i=0;i<n-1;i++){
k=i;
for(j=i;j<n;j++){
if(arr[k]>arr[j])
swap(arr[k],arr[j]);
}
}
}
int main(){
void sort(int arr[],int n);
int m;
cin>>m;
int a[100];
for(int i=0;i<m;i++)
cin>> a[i];
sort(a,m);
for(int i=0;i<m;i++)
cout<<a[i]<<endl;
return 0;
}
快速排序
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
代码如下
#include<iostream>
using namespace std;
const int N=10000;
int a[N];
int n;
void quick_sort(int a[],int l,int r)
{
if(l>=r)return;
int m=a[l];
int i=l-1,j=r+1;
while(i<j){
do i++;while(a[i]<m);
do j--;while(a[j]>m);
if(i<j)
swap(a[i],a[j]);
}
quick_sort(a,l,j);
quick_sort(a,j+1,r);
}
int main()
{
cin>>n;
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];
return 0;
}
归并排序
归并排序的过程:
设有数列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
代码如下
#include<iostream>
using namespace std;
const int N=10000;
int a[N],tmp[N];
int n;
void merge_sort(int a[],int l,int r)
{
if(l>=r)return;
int mid=l+r>>1;//取中间值
merge_sort(a,l,mid);
merge_sort(a,mid+1,r);
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r)
if(a[i]<=a[j])
tmp[k++]=a[i++];
else tmp[k++]=a[j++];
while (i<=mid)
tmp[k++]=a[i++];
while(j<=r)
tmp[k++]=a[j++];
for(i=l,j=0;i<=r;i++,j++)
a[i]=tmp[j];
}
int main()
{
cin>>n;
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]<<endl;
return 0;
}