一、冒泡排序
其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]>a[i],则交换它们,一直比较到a[n]。
同理对a[1],a[2],...a[n-1]处理,即完成排序。
void bubble(int a[],int n){
int t;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
if(a[i]>a[j])
t=a[i],a[i]=a[j],a[j]=t;
}
二、二分排序
原理:依次枚举每一个元素,采用二分搜索的方法在前i个数据中找到合适的位置插入(前i个数据已经排列好)。
例:给6 1 2 7 9 3 4 5 10 8排序
6 1 2 7 9 3 4 5 10 8
1插到6前面
1 6 2 7 9 3 4 5 10 8
1 2 6 7 9 3 4 5 10 8
1 2 6 7 9 3 4 5 10 8
1 2 6 7 9 3 4 5 10 8
3插到6前面
1 2 3 6 7 9 4 5 10 8
4插到6前面
1 2 3 4 6 7 9 5 10 8
5插到6前面
1 2 3 4 5 6 7 9 10 8
1 2 3 4 5 6 7 9 10 8
8插到9前面
1 2 3 4 5 6 7 8 9 10
#include<iostream>
using namespace std;
void sort2(int *a,int n){
for(int i=0;i<n;i++){//对前i个进行排序
int k=a[i];
int x=0,y=i-1;
while(x<=y){
int m=x+(y-x>>1);
if(a[m]>a[i])
y=m-1;
else
x=m+1;
}//a[x]为第一个大于a[i]的数
for(int j=i;j>x;j--)
a[j]=a[j-1];//插入点后面的数全部后移一位
a[x]=k;//把a[i]赋值到对应位置
}
}
三、快速排序
设置两点i,j代表向左和向右遍历到的点;
j遇到小于6的5停止向前,i遇到大于6的7,停止;
交换a[i]与a[j];
i,j未再遇到符合停止条件的值,继续向前直到相遇时停止;
将6与相遇点交换;
此时6左边的值均小于6,右边的值均大于6,6最终的位置定下来;
分别对6左边的片段和右边的片段重复该过程,直到片段被切成长度为1,最终所有值都找到了排序的位置。
void quick(int a[],int x,int y){
if(x>=y)
return;
int p=a[x];
int i=x,j=y;
while(i<j){
//交换右边小于p左边大于p的数字并找出p的位置
while(i<j&&a[j]>=p)
j--;
while(i<j&&a[i]<=p)
i++;
int t=a[i];
a[i]=a[j];
a[j]=t;
}
a[x]=a[i];
a[i]=p;
quick(a,x,i-1);//快速排序左边一段
quick(a,i+1,y);//快速排序右边一段
}