使用std::sort进行相关数组的排序笔记

一、相关的简单程序

1. std::sort 简单的排序应用

  • 程序首先创建一个num[ ]的索引数组,索引数量大小与数据数组的arr[ ]大小相关
  • 通过std::sort ( RandomIt first, RandomIt last, Compare comp )排序
  • RandomIt first:排序的起始位置
  • RandomIt last:排序的终止位置( first 和 last 构成排序的范围)
  • Compare comp:排序的比较函数
  • 通过自己写的排序函数comp( )对数组arr[ ]的数据进行比较,然后对索引数组进行索引的排序,可以在不打乱arr[ ]数据情况下,通过数据的索引得到arr[ ]数据大小排序。
  • 索引数组排列顺序是根据指向数据由小到大进行排列的
#include <iostream>
#include <cmath>
#include <algorithm>

using namespace std;

//数组mun[]是数组arr[]的数据索引标志数组
//数组arr[]是相关的数据数组
int num[12] ={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
int arr[12] = {5, 6, 7, 2, 3, 4, 0, 12, 2, 34, 12, 6};

//comp函数用于比较arr[]数据的大小
bool comp (int i, int j) { return(arr[i]<arr[j]); }

void print_main()
{
    cout << "Hello" << endl;

    printf("----- The index after sort of arr[] -----\n");
    printf("----- The index order from to smallest to largest  -----\n");
    printf("\n");
    printf("----- Printf the index ----- \n");
    //重新排序后的索引是由根据指向数据由小到大排列的,这边打印的索引index数组num[ ]是由大到小进行打印(i--)
    std::sort (num, num + 12 + 1, comp);
    for (int i = 12; i > 0; i--)
    {
        printf("%d ", num[i]);
    }
    printf("\n");

    printf("----- Printf the arr using the index ----- \n");
    //重新排序后的索引是由根据指向数据由小到大排列的,这边索引index指向数据是由大到小进行排列(i--)
    for (int i = 12; i > 0; i--)
    {
        int ind = num[i];
        printf("%d ", arr[ind]);
    }
    printf("\n");
    printf("\n");


     /****************/
    printf("----- Before sorting arr by std::sort ----- \n");
    for (int i = 11; i >= 0; i--)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    printf("----- After sorting arr by std::sort ----- \n");
    std::sort (arr, arr + 12);
    for (int i = 11; i >= 0; i--)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");

}

2.程序运行结果

在这里插入图片描述

二、更改数据结构的排序程序

1. 创建相关的排序数据结构

  • 创建一个以排序为目的的数据结构体,包含有存储的信息value和索引号ind
  • 创建一个用于比较前后大小的比较函数by_value
#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>

struct sort_t{ 
    int value;
    size_t ind;
};

struct by_value{ 
    bool operator()(sort_t const &left, sort_t const &right) { 
        return left.value < right.value;
    }
};

// 需要进行排序的数组
int arr[12] = {5, 6, 7, 2, 3, 4, 0, 12, 2, 34, 12, 6};

// 创建向量容器进行存储数组信息
std::vector<sort_t> sortArr;


void testStructSort()
{
    sortArr.resize(12);
    for (int i = 0; i < 12; i++)
    {
        sortArr[i].value = arr[i];
        sortArr[i].ind = i;
    }
	
	// 打印排序前的信息
    for (int i = 0; i < 12; i++)
    {   printf("%d ", sortArr[i].value);    }
    printf("\n");
    for (int i = 0; i < 12; i++)
    {   printf("%d ", sortArr[i].ind);  }
    printf("\n \n");

    
    // 进行相关的std::sort排序
    std::sort(sortArr.begin(), sortArr.begin()+12, by_value());

    // 打印排序后的信息
    for (int i = 0; i < 12; i++)
    {   printf("%d ", sortArr[i].value);  }
    printf("\n");
    for (int i = 0; i < 12; i++)
    {   printf("%d ", sortArr[i].ind);  }
    printf("\n");

}

2.程序运行结果

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值