对vector中的数据排序
生活随笔
收集整理的這篇文章主要介紹了
对vector中的数据排序
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
要求:從文件fin中讀取數(shù)據(jù),每行的格式如"王明 85",代表"姓名 成績(jī)",具體有多少行不確定。按成績(jī)從大到小排序,將結(jié)果寫(xiě)入文件fout.
/*功能:從文件fin中讀取"name grade",并按照grade從大到小排序經(jīng)驗(yàn):操作vector也可以像操作普通數(shù)組一樣操作(使用下標(biāo)),前提是沒(méi)有結(jié)點(diǎn)的刪除或增加 */ #include <stdio.h> #include <iostream> #include <vector>using namespace std;typedef struct {char name[20];int grade; }Node;vector<Node>::iterator searchMax(vector<Node> &v) // 返回vector中g(shù)rade最大的結(jié)點(diǎn) {vector<Node>::iterator ret = (vector<Node>::iterator)NULL;if(v.size() > 0){ret = v.begin();for(vector<Node>::iterator it = ret + 1; it != v.end(); it++){if(ret->grade < it->grade)ret = it;}}return ret; }void display(vector<Node> &v) {for(vector<Node>::iterator it = v.begin(); it != v.end(); it++){printf("%d ", it->grade);}printf("\n"); }void swap(Node * p1, Node *p2) // 交換兩個(gè)結(jié)點(diǎn)的值 {Node t;t = *p1;*p1 = *p2;*p2 = t; }void bubbleSort(vector<Node> &v) // vector像使用普通數(shù)組一樣使用 {int i, j, len;int flag;len = v.size();for(i = 0; i < len; i++){flag = 0;for(j = 0; j < len - i - 1; j++){if(v[j].grade < v[j+1].grade){flag = 1;swap(&v[j], &v[j+1]); // 交換兩結(jié)點(diǎn)值}}if(!flag) // 本輪未交換過(guò)元素值,表明已有序break;display(v);printf("*****************************************\n");} }void writeVector(FILE *fout, vector<Node> &v) {for(vector<Node>::iterator it = v.begin(); it != v.end(); it++){fprintf(fout, "%s %d\n", it->name, it->grade);} }int main(int argc, char **argv) {char fin[] = "a.txt";char fout[] = "a_out.txt";FILE *fp1, *fp2;vector<Node> v;fp1 = fopen(fin, "r");fp2 = fopen(fout, "w");if(fp1 == NULL || fp2 == NULL){printf("Open file error!\n");return 1;}// 從文件讀取數(shù)據(jù)Node node;while(fscanf(fp1, "%s %d\n", node.name, &node.grade) == 2)v.push_back(node);fclose(fp1);display(v); // 顯示讀取的數(shù)據(jù)// 方法一:調(diào)用bubbleSort()printf("----------------------------------------------------\n"); bubbleSort(v);printf("====================================================\n");display(v);writeVector(fp2, v);// 方法二:通過(guò)searchMax() /* vector<Node>::iterator max = (vector<Node>::iterator)NULL;while(v.size() > 0){max = searchMax(v);if(max == (vector<Node>::iterator)NULL)break;fprintf(fp2, "%s %d\n", max->name, max->grade);v.erase(max);}*/fclose(fp2);return 0; }結(jié)論:對(duì)vector排序,可像操作數(shù)組一樣方便的操作。前提是沒(méi)有結(jié)點(diǎn)的增、刪。
========================================================================
另附:整數(shù)數(shù)組選擇排序算法:
void disp(int a[], int len) {int i = 0;for(; i < len; i++){printf("%d ", a[i]);}printf("\n"); }void selectSort(int a[], int len) // 選擇排序 {int i, j, k, t;for(i = 0; i < len; i++){k = i;for(j = i+1; j < len; j++){if(a[j] > a[k])k = j; // k指向最大值}if(k != i){t = a[i];a[i] = a[k];a[k] = t;}elsecontinue;for(j = 0; j < i; j++)printf("| ");disp(a+i, len-i);} }總結(jié)
以上是生活随笔為你收集整理的对vector中的数据排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 华为手机安装软件出现签名不一致
- 下一篇: proc文件(OLD)