【算法】常用的排序方法
?這里總結了幾種排序方法,直接有函數可以調用。
sort頭函數:
//sort.H
#ifndef SORT_H
#define SORT_H
void InsertSort(int arry[],int n);
void?DubbleSort(int arry[],int n);
void?SelectionSort(int arry[],int n);
#endif
?sort主函數:
#include <stdio.h>
#include <stdlib.h>
#include "sort.h"
//代碼
?
?
插入排序:
void InsertSort(int arry[],int n)
{
int i,j,temp;
for (i=1;i<n;i++)
{
temp = arry[i];
j=i-1;
while (j>-1 &&temp<arry[j])
{
arry[j+1]=arry[j];
j--;
}
arry[j+1]=temp;
}
for(i=0;i<n;i++)
printf("%d ",arry[i]);
}
?
冒泡排序:
void?DubbleSort(int arry[],int n);
{
int i,j,temp;
for(j=0;j<n-1;j++)
for(i=0;i<n-1-j;i++)
{
if(arry[i]>arry[i+1])
{
temp=arry[i];
arry[i]=arry[i+1];
arry[i+1]=temp;
}
}
for(i=0;i<n;i++)
printf("%d ",arry[i]);
}
?
選擇排序:
void?SelectionSort(int arry[],int n);
{
int i,j,k,temp;
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(arry[j]<arry[k])?k=j;
}
temp=arry[k];
arry[k]=arry[i];
arry[i]=temp;
}
for(i=0;i<n;i++)
printf("%d ",arry[i]);
}
?
主函數:
#include <stdio.h>
#include <stdlib.h>
#include"sort.h"
int main()
{
int arry[10]={2,4,12,0,-1,6,8,3,1,12};
int1 n=10;
//選擇功能函數
return 0;
}
?
?
對于排序,我們一直使用的是自己編寫排序函數,但是在機試中,對待不同規模的數組我們不可能在內存和時間限制下編寫一個合適的排序函數。這個時候可以使用C++中的內部函數sort( )
下面是一個升序排序案例:
#include <stdio.h> #include <algorithm> using namespace std;int main() {int n;int buf[10000];while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++){ scanf("%d",&buf[i]); } sort(buf,buf+n);//這里的倆個參數表示排序內存起始地址和結束地址 for(int i=0;i<n;i++){ printf("%d",buf[i]); } printf("\n"); } return 0; }如果要降序的話,需要對sort( )函數進行重載。此時我們需要定義一個cmp函數。為了降序排列,我們判斷兩個參數的大小,當第一個參數比第二個參數大時返回true。
#include <stdio.h> #include <algorithm> using namespace std;bool cmp (int x, int y)//當cmp返回值為true時,即表示cmp函數的第一個參數將會排在第二個參數之前 {return x>y; }int main () {int n; int buf[10000]; while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++){ scanf("%d",&buf[i]); } sort(buf,buf+n,cmp);//此時函數重載了 for(int i=0;i<n;i++){ printf("%d",buf[i]); } printf("\n"); } return 0; }?接下來是對結構體數值的排序。同理。
比如:將N個學生數據從高到低排序,如果成績相同則按照姓名字符的字母排序,如果姓名的字母也相同則按照學生的年齡排序。
#include <stdio.h> #include <algorithm> #include <string.h> using namespace std;struct E{char name[100];int age; int score; }buf[100]; bool cmp (E a,E b) { if(a.score!=b.score) return a.score<b.score;//成績高低排序 int tmp =strcmp(a.name,b.name); if(tmp != 0) return tmp<0;//如果成績相同,就按照姓名字符排序 else return a.age>b.age;//成績相同,姓名字母序相同則按照學生年齡排序 } int main () { int n; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%s%d%d",buf[i].name,&buf[i].age,&buf[i].score); } sort(buf,buf+n,cmp); for(int i=0;i<n;i++) { printf("%s %d %d\n",buf[i].name,buf[i].age,buf[i].score); } } return 0; }?
轉載于:https://www.cnblogs.com/guangluwutu/p/4271095.html
總結
以上是生活随笔為你收集整理的【算法】常用的排序方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: COJ 1163 乘法逆元的求解
- 下一篇: IOS 开发-- 常用-- 核心代码