在本文中将列出几种常用的排序算法源码。
选择排序算法:
//选择排序 注意数组第一个数下标是0;不提供输出;
void selectsort(int a[],int n){
for(int i=0;i<n;i++){
int k=i+1;
for(int j=i;j<n;j++){
if(a[j]<a[k]){
k=j;
}
}
int temp=a[i];
a[i]=a[k];
a[k]=temp;
for(int l=0;l<i;l++){
// printf("%d\n",a[l]);
}
}
printf("使用的是选择排序\n");
}
直接插入排序算法:
//直接插入排序,第一个数的下标是0,不提供输出;
void insertsort(int a[],int n){
for(int i=1;i<n;i++){
int temp=a[i];
int j=0;
j=i;
while(j>0 && temp<a[j-1]){
a[j]=a[j-1];
j--;
}
a[j]=temp;
// printf("%d\n ",a[j]);
}
printf("使用的是直接插入排序\n");
}
在进行考试的大多数情况下,只需要最终的排序结果,所以推荐使用c语言的库函数qsort或者c++的sort进行排序,sort简洁一些。使用sort函数的时候需要引入 #include<algorithm>和 using namespace std;
sort()使用方式:
sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(选填));如果不写比较函数,那么默认递增。
比较函数的写法:cmp(数据类型 a,数据类型 b){ return a>b;}
该写法表示按着从大到小排序,a<b则表示从小到大排序。
如果需要进行结构体排序那么:
struct node {
int x,y;
}nd[10];
cmp(node a,node b){
if (a.x != b.x) return a.x > b.x;
else return a.y>b.y;
}
意思是在结构体中存在两个变量,首先比较x,按从大到小比较,如果两个x相等,那么比较y。如果不需要比较第二个元素, 那么直接返回a.x>b.x就可以了。
如果需要容器排序:
bool cmp(int a,int b){
return a<b;
}
vector <int> vi;
vi.push_back(3);
vi.push_back(4);
vi.push_back(1);
sort(vi.begin(),vi.end(),cmp);//对整个vector进行排序
如果需要字符串排序:
第一种情况:按字典顺序
sort(str,str+6);//将string型数组按字典顺序从小到大输出。
第二种情况:按长度排序;
bool cmp(string str1,string str2){
return str1.length() < str2.length();
}
sort(str.str+4,cmp);//按长度排序;