7-12 排序

给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。

本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据1:只有1个元素;
  • 数据2:11个不相同的整数,测试基本正确性;
  • 数据3:103个随机整数;
  • 数据4:104个随机整数;
  • 数据5:105个随机整数;
  • 数据6:105个顺序整数;
  • 数据7:105个逆序整数;
  • 数据8:105个基本有序的整数;
  • 数据9:105个随机正整数,每个数字不超过1000。

 

输入格式:

输入第一行给出正整数N(105),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。

输出格式:

在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。

输入样例:

1
2
11
4 981 10 -17 0 -20 29 50 8 43 -5

 

输出样例:

1
-20 -17 -5 0 4 8 10 29 43 50 981

 

 

 

代码:

快速排序算法:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<bits/stdc++.h>
using namespace std;
 
int n;
int a[100005];
int Partition(int left,int right)   //确定枢轴的位置
{
     
    int tmp = a[left];
    while(left!=right)
    {
        while(left<right&&a[right]>=tmp)right--;
        a[left] = a[right];
        while(left<right&&a[left]<=tmp)left++;
        a[right] = a[left];
    }
    a[left] = tmp;
    return left;
}
 
void QuickSort(int left,int right){
    if(left<right){
        int pos=Partition(left, right);
        QuickSort(left, pos-1);
        QuickSort(pos+1, right);
    }
}
int main(){
    //快速排序
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    QuickSort(1, n);
    for(int i=1;i<=n;i++){
        printf("%d",a[i]);
        if(i!=n)printf(" ");
    }
    return 0;
}

 

 

 

 

 

c++库提供的sort()函数

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cstdio>
#include <algorithm>
  
using namespace std;
  
int a[100005];
  
int main() {
    int n;
     
    scanf("%d", &n); // input
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);
     
    <strong>sort(a, a+n); // sort注意下标是从0开始的,若下标从1开始,则是sort(a+1,a+n+1)</strong>
     
    printf("%d", a[0]); // output
    for (int i = 1; i < n; i++)
        printf(" %d", a[i]);
     
    return 0;
}

 

 

 

C++ STL 标准库中的 sort()  函数,本质就是一个模板函数。正如表 1 中描述的,该函数专门用来对容器或普通数组中指定范围内的元素进行排序,排序规则默认以元素值的大小做升序排序,除此之外我们也可以选择标准库提供的其它排序规则(比如std::greater<T>降序排序规则),甚至还可以自定义排序规则。

sort() 函数是基于快速排序实现的,有关快速排序的具体实现过程,感兴趣的读者可阅读《快速排序(QSort,快排)算法》一文。

需要注意的是,sort() 函数受到底层实现方式的限制,它仅适用于普通数组和部分类型的容器。换句话说,只有普通数组和具备以下条件的容器,才能使用 sort() 函数:

  1. 容器支持的迭代器类型必须为随机访问迭代器。这意味着,sort() 只对 array、vector、deque 这 3 个容器提供支持。
  2. 如果对容器中指定区域的元素做默认升序排序,则元素类型必须支持<小于运算符;同样,如果选用标准库提供的其它排序规则,元素类型也必须支持该规则底层实现所用的比较运算符;
  3. sort() 函数在实现排序时,需要交换容器中元素的存储位置。这种情况下,如果容器中存储的是自定义的类对象,则该类的内部必须提供移动构造函数和移动赋值运算符。

 

 

 

 

总结:

 

 

在计算机科学中,一个原地算法(in-place algorithm)基本上不需要额外辅助的数据结构,然而,允许少量额外的辅助变量来转换数据的算法。当算法运行时,输入的数据通常会被要输出的部分覆盖掉。不是原地算法有时候称为非原地(not-in-place)或不得其所(out-of-place)。–摘自维基百科。

 

not an in place sort algorithm:基数排序、归并排序

in place sort algorithm : 插入排序、选择排序、堆排序、快速排序

 

posted @   Yohoc  阅读(84)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示