排序方法
在C/C++中怎样对一个无序序列进行排序?
选择排序
void select_sort(int arr[], int length) {
for (int i = 0; i < length - 1; i++) {
int min_in = i;
for (int j = i + 1; j < length; j++) {
if (arr[j] < arr[min_in]) {
min_in = j;
}
}
swap(arr[i], arr[min_in]);
}
}
选择排序最好写,但是对于一些数据量大的题目,容易超时。。。
那我写归并排序,数据再多也不用担心超时啦~
But
如果在比赛时,自己写排序方法,绝对不是明智之举:敲代码浪费时间的同时还不能保证一次写对。。。
并且如果待排序的数列元素不是基本数据类型,而是包含多种数据的结构体,就更加难处理了。
So
使用C/C++的库中提供的排序方法是很有必要的,不仅不用担心效率问题,还可以自定义排序函数,想怎么排就怎么排XD
-
C中的库排序方法
函数:qsort()
头文件:<stdlib.h>
使用实例:
#include <stdio.h> #include <stdlib.h> //结构体,存储学生的姓名和成绩 typedef struct Student { char name[10]; int score; } Student; //普通数组从小到大排序函数 int Cmp(const void* x, const void* y) { //void* 是空类型指针类型,意为可指向任意类型的数据 //*(int*) 是将空类型指针强制类型转化为 int 类型之后再取值 //从大到小 //return *(int*)x + *(int*)y; //从小到大 return *(int*)x - *(int*)y; } //学生结构体数组根据成绩从小到大排序 int StuCmp(const void* x, const void* y) { //取出指针指向的结构体中的成绩数据 int score_x = (*(Student*)x).score; int score_y = (*(Student*)y).score; return score_x - score_y; } int main() { int arr[5] = {2, 1, 4, 3, 5}; Student stu_arr[5] = {{"Alice", 200}, {"Bob", 100}, {"Candy", 400}, {"Daisy", 300}, {"Ellen", 500}}; //参数从左到右依次为:待排序数组,数组长度,数组元素大小,排序函数 qsort(arr, 5, sizeof(int), Cmp); int i; for (i = 0; i < 5; i++) { printf("%d ", arr[i]); } printf("\n"); //根据成绩对学生数组进行排序 qsort(stu_arr, 5, sizeof(Student), StuCmp); for (i = 0; i < 5; i++) { printf("%s %d\n", stu_arr[i].name, stu_arr[i].score); } printf("\n"); return 0; }
运行效果:
-
C++中的库排序方法
函数:sort()
头文件:< algorithm>
使用实例:
#include <iostream> #include <vector> #include <algorithm> using namespace std; //和 C 不同的地方: //可不指定排序方法,默认为从小到大 //返回值为 bool 型 //排序函数的形参可直接指定为待排序的数组元素类型 //调用时的应传入的参数不同 //可以支持 STL 中容器的排序 struct Student { char name[10]; int score; }; bool Cmp(int x, int y) { //从小到大 //return x < y; //从大到小 return x > y; } bool StuCmp(Student x, Student y) { int score_x = x.score; int score_y = y.score; return score_x > score_y; } int main() { int arr[5] = {2, 1, 4, 3, 5}; Student stu_arr[5] = {{"Alice", 200}, {"Bob", 100}, {"Candy", 400}, {"Daisy", 300}, {"Ellen", 500}}; //参数从左到右依次为:数组的头指针,数组的尾指针,排序方法函数 sort(arr, arr + 5, Cmp); int i; for (i = 0; i < 5; i++) { cout << arr[i] << " "; } cout << endl; //根据成绩对学生数组进行排序 sort(stu_arr, stu_arr + 5, StuCmp); for (i = 0; i < 5; i++) { cout << stu_arr[i].name << " " << stu_arr[i].score << endl; } cout << endl; //使用 arr 数组创建一个容器 vector<int> vec(arr, arr + 5); //对 vector 容器进行排序 //形参从左到右以此为:待排序容器的迭代器,待排序容器的迭代器,排序方法 sort(vec.begin(), vec.end(), Cmp); for (i = 0; i < 5; i++) { cout << vec[i] << " "; } cout << endl; return 0; }
运行效果: