排序问题

(1)插入排序

 1 void insertSort(int arr[], int n){
 2     int i,j,t;
 3 
 4     for(i=1; i<n; i++){
 5         t = arr[i];
 6         for(j=i-1; arr[j]>t && j>=0; j--){
 7             arr[j+1] = arr[j];
 8         }
 9         arr[j+1] = t;
10     }
11 }

(2)简单的快速排序

 

 1 void q_sort(int arr[], int sp, int ep){
 2     int m, i, t;
 3 
 4     if(sp >= ep)
 5         return;
 6     else{
 7         m = sp;
 8         for(i=sp+1; i<=ep; i++){
 9             if(arr[i] < arr[sp]){
10                 m++;
11                 t = arr[m];
12                 arr[m] = arr[i];
13                 arr[i] = t;
14             }
15         }
16 
17         t = arr[sp];
18         arr[sp] = arr[m];
19         arr[m] = t;
20 
21         q_sort(arr, sp, m-1);
22         q_sort(arr, m+1, ep);
23     }
24 }

原理:利用分治的思想,将数组排序范围最左端的元素作为参照,将比其小的元素移到其左边,将比其大的元素移动到其右边,在分别对两边的进行递归排序即可。


 

(3)更好的几种快速排序

1、双向划分

 1 void q_sort2(int arr[], int sp, int ep){
 2     int i, j, t;
 3     if(sp >= ep)
 4         return;
 5     else{
 6         i = sp;
 7         j = ep + 1;
 8         while(1){
 9             do{i++;} while(i<=ep && arr[i]<arr[sp]);
10             do{j--;} while(j>=sp && arr[j]>arr[sp]);
11 
12             if(i>j) break;
13             else{
14                 t = arr[i];
15                 arr[i] = arr[j];
16                 arr[j] = t;
17             }
18         }
19         
20         t = arr[sp];
21         arr[sp] = arr[j];
22         arr[j] = t;
23 
24         q_sort2(arr, sp, j-1);
25         q_sort2(arr, j+1, ep);
26     }
27 }

2、随机选取参照元素

将sp出的元素与[sp, ep]中随机的某个元素进行交换,再以sp处的元素作为参照进行分割排序,可以使得最差复杂度也趋近于O(nlogn)

 

转载于:https://www.cnblogs.com/lwyeah/p/8586475.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Elasticsearch中,排序问题可能出现在聚合操作中。根据引用的描述,Elasticsearch在排序操作时,会先对每个分片进行排序,然后将每个分片的前17名结果进行再次聚合和排序,最终返回排序后的前5条记录作为结果。这个排序策略来源于官方给出的算式,根据算式,如果请求只发往一个分片,就返回前5条记录;如果请求发送给多个分片,每个分片返回的记录数是5 * 1.5 = 17。这个策略可能导致在返回的数据中,实际的排序结果与期望的排序结果不一致。 因此,如果你在Elasticsearch中遇到排序问题,可以检查是否涉及到了多个分片,并且了解Elasticsearch的排序策略。你可以参考引用提供的链接来了解更多关于Elasticsearch排序操作的详细信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Elasticsearch聚合学习之五:排序结果不准的问题分析](https://blog.csdn.net/boling_cavalry/article/details/90319399)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [3. elasticsearch 汇总排序问题剖析](https://blog.csdn.net/wangzhiqiang123456/article/details/123073114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值