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个空格分隔,行末不得有多余空格。
输入样例:
11 4 981 10 -17 0 -20 29 50 8 43 -5
输出样例:
-20 -17 -5 0 4 8 10 29 43 50 981
代码:
快速排序算法:
#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()函数
#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]);
	
	sort(a, a+n); // sort注意下标是从0开始的,若下标从1开始,则是sort(a+1,a+n+1)
	
	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() 函数:
- 容器支持的迭代器类型必须为随机访问迭代器。这意味着,sort() 只对 array、vector、deque 这 3 个容器提供支持。
- 如果对容器中指定区域的元素做默认升序排序,则元素类型必须支持<小于运算符;同样,如果选用标准库提供的其它排序规则,元素类型也必须支持该规则底层实现所用的比较运算符;
- sort() 函数在实现排序时,需要交换容器中元素的存储位置。这种情况下,如果容器中存储的是自定义的类对象,则该类的内部必须提供移动构造函数和移动赋值运算符。
总结:
 
在计算机科学中,一个原地算法(in-place algorithm)基本上不需要额外辅助的数据结构,然而,允许少量额外的辅助变量来转换数据的算法。当算法运行时,输入的数据通常会被要输出的部分覆盖掉。不是原地算法有时候称为非原地(not-in-place)或不得其所(out-of-place)。–摘自维基百科。
not an in place sort algorithm:基数排序、归并排序
in place sort algorithm : 插入排序、选择排序、堆排序、快速排序
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号