6 条题解

  • 2
    @ 2024-5-28 20:06:14
    menu:
    The first is the "sort" version.
    The second is the full version of quicksort.(437ms)
    And the third one is the optimized version.(285ms)
    
    sort
    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int n;
    	cin >> n;
    	vector<int> a;
    	int x;
    	for (int i = 1;i <= n;i++)
    	{
    		cin >> x;
    		a.push_back(x);
    	}
    	sort(a.begin(),a.end());
    	for (int i = 0;i < n;i++)
    	{
    		cout << a[i] << " ";
    	}
    	return 0;
     }
    

    由于管理员的要求,所以我又写了个完整版的

    the full version
    #include <bits/stdc++.h>
    using namespace std;
    int n;
    vector<int> a;
    void qsort(int l,int r);
    int main()
    {
    	cin >> n;
    	int xxx;
    	for (int i = 1;i <= n;i++)
    	{
    		cin >> xxx;
    		a.push_back(xxx);
    	}
    	qsort(0,n-1);
    	for (int i = 0;i < n;i++)
    	{
    		cout << a[i] << " ";
    	}
    	return 0;
    }
    void qsort(int l,int r)
    {
    	int x = a[(l+r)/2];
    	int i = l,j = r;
    	while (i <= j)
    	{
    		while(a[i] < x)
    		{
    			i++;
    		}
    		while(a[j] > x)
    		{
    			j--;
    		}
    		if (i<=j)
    		{
    			swap(a[i],a[j]);
    			i++;
    			j--;
    		}
    	}
    	if (l < j)
    	{
    		qsort(l,j);
    	}
    	if (r > i)
    	{
    		qsort(i,r);
    	}
    	return;
    }
    

    但是我发现需要437ms,于是加了一点点优化

    the optimized version
    #include <bits/stdc++.h>
    using namespace std;
    int n;
    vector<int> a;
    void qsort(int l,int r);
    int main()
    {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);//优化
    	cin >> n;
    	int xxx;
    	for (int i = 1;i <= n;i++)
    	{
    		cin >> xxx;
    		a.push_back(xxx);
    	}
    	qsort(0,n-1);
    	for (int i = 0;i < n;i++)
    	{
    		cout << a[i] << " ";
    	}
    	return 0;
    }
    void qsort(int l,int r)
    {
    	int x = a[(l+r)/2];
    	int i = l,j = r;
    	while (i <= j)
    	{
    		while(a[i] < x)
    		{
    			i++;
    		}
    		while(a[j] > x)
    		{
    			j--;
    		}
    		if (i<=j)
    		{
    			swap(a[i],a[j]);
    			i++;
    			j--;
    		}
    	}
    	if (l < j)
    	{
    		qsort(l,j);
    	}
    	if (r > i)
    	{
    		qsort(i,r);
    	}
    	return;
    }
    

    这样时间好了一点,有心情的可继续优化

    题解制作困难,请点赞支持一下!!!

    • 1
      @ 2023-9-1 13:28:39

      定义

      快速排序(英语:Quicksort),又称分区交换排序(英语:partition-exchange sort),简称「快排」,是一种被广泛运用的排序算法。

      基本原理与实现

      过程

      快速排序的工作原理是通过 分治 的方式来将一个数组排序。

      快速排序分为三个过程:

      1. 将数列划分为两部分(要求保证相对大小关系);
      2. 递归到两个子序列中分别进行快速排序;
      3. 不用合并,因为此时数列已经完全有序。

      和归并排序不同,第一步并不是直接分成前后两个序列,而是在分的过程中要保证相对大小关系。具体来说,第一步要是要把数列分成两个部分,然后保证前一个子数列中的数都小于后一个子数列中的数。为了保证平均时间复杂度,一般是随机选择一个数 mm 来当做两个子数列的分界。

      之后,维护一前一后两个指针 ppqq,依次考虑当前的数是否放在了应该放的位置(前还是后)。如果当前的数没放对,比如说如果后面的指针 qq 遇到了一个比 mm 小的数,那么可以交换 ppqq 位置上的数,再把 pp 向后移一位。当前的数的位置全放对后,再移动指针继续处理,直到两个指针相遇。

      其实,快速排序没有指定应如何具体实现第一步,不论是选择 mm 的过程还是划分的过程,都有不止一种实现方法。

      第三步中的序列已经分别有序且第一个序列中的数都小于第二个数,所以直接拼接起来就好了。

      ps:想想办法实现一下快速排序,不要直接用sort

      • 0
        @ 2023-9-1 23:41:53

        把计数排序的代码转移到这就可以通过。 核心代码:

        int main() {
            int n;
            cin >> n;
            
            vector<int> arr(n);
            
            for (int i = 0; i < n; i++) {
                cin >> arr[i];
            }
            
            sort(arr.begin(), arr.end());
            
            for (int i = 0; i < n; i++) {
                cout << arr[i];
                if (i < n - 1) {
                    cout << " ";
                }
            }
            
            cout << endl;
        

        我觉得够核心了吧

        • -1
          @ 2023-11-11 15:59:43

          做出来啦!!!

          #include <bits/stdc++.h>
          #define ll long long
          #define re register int
          using namespace std;
          ll n;
          int main()
          {
              cin >> n;
              vector<ll> vec;
              for (re i = 1; i <= n; i++)
              {
                  ll x;
                  cin >> x;
                  vec.push_back(x);
              }
              sort(vec.begin(), vec.end());
              for (re i = 0; i < n; i++)
                  cout << vec[i] << " ";
              return 0;
          }
          
          • -1
            @ 2023-9-11 18:01:39
            #include <bits/stdc++.h> 
            using namespace std;
            int n,a[50001];
            int main()
            {
                scanf("%d",n);
                for(int i=1;i<=n;i++)
                {
                    scanf("%d",a[i]);
                }
                sort(a+1·a+n+1);
                for(int i=1;i<=n;i++)
                {
                    printf("%d",a[i]);
                }
                return 0;
            }
            

            以AC

          • -4
            @ 2023-10-6 9:48:59

            不用sort,用归并排序,速度最快

            • 1

            信息

            ID
            487
            时间
            1000ms
            内存
            256MiB
            难度
            5
            标签
            递交数
            499
            已通过
            201
            上传者