题目链接:Running Time of Quicksort

Challenge 
In practice, how much faster is Quicksort (in-place) than Insertion Sort? Compare the running time of the two algorithms by counting how many swaps or shifts each one takes to sort an array, and output the difference. You can modify your previous sorting code to keep track of the swaps. The number of swaps required by Quicksort to sort any given input have to be calculated. Keep in mind that the last element of a block is chosen as the pivot, and that the array is sorted in-place as demonstrated in the explanation below.

Any time a number is smaller than the partition, it should be "swapped", even if it doesn't actually move to a different location. Also ensure that you count the swap when the pivot is moved into place. The count for Insertion Sort should be the same as the previous challenge, where you just count the number of "shifts".

Input Format 
There will be two lines of input:

  • n - the size of the array
  • ar - n numbers that makes up the array

Output Format 
Output one integer D, where D = (insertion sort shifts) - (quicksort swaps)

Constraints 
1<=s<=1000 
-1000<=x<= 1000 , x ∈ ar

Sample Input

7
1 3 9 8 2 7 5

Sample Output

1

Explanation 
Insertion Sort will take 9 "shifts" to sort the array. Quicksort will take 8 "swaps" to sort it, as shown in the diagram below. 9-8 = 1, the output.


题解:统计排序中快速排序和插入排序元素移动次数的差。对于插入排序,统计元素移动的次数;对于快速排序统计元素交换的次数(包括自己跟自己交换),然后输出二者之差。

对于插入排序元素的移动次数可以参见:Insertion Sort Advanced Analysis,不过这道题暴力可能也可以过,有现成的代码就拿来用了。

对于快速排序,直接在排序过程中统计交换次数就可以了,上述引自HackerRank的图很好的说明了快速排序中Partition的工作过程。

最终代码如下:

 import java.util.*;

 public class Solution {
private static long answer = 0;
private static long swaps = 0;
private static void swap(int[] ar,int i,int j){
swaps++;
int temp = ar[i];
ar[i] = ar[j];
ar[j]= temp;
return;
}
private static int Partition(int[] ar,int start,int end){
int pivot = ar[end];
int i = start;
int j = start;
while(i<end){
if(ar[i]< pivot ){
swap(ar,i,j);
i++;
j++;
}
else {
i++;
}
}
swap(ar,j, end);
return j;
} private static void quickSort(int[] ar,int start,int end){
if(start >= end)
return;
int pivot = Partition(ar,start,end);
quickSort(ar,start,pivot-1);
quickSort(ar, pivot+1, end);
}
private static int[] Merge(int[] ar1,int[] ar2){
int m = ar1.length;
int n = ar2.length; int point1 = 0;
int point2 = 0;
int index_result = 0;
int[] result = new int[m+n];
while(point1 < m && point2 < n){
if(ar1[point1] < ar2[point2]){
result[index_result] = ar1[point1];
point1++;
index_result++;
}
else if(ar1[point1] > ar2[point2]){
answer += m - point1;
result[index_result] = ar2[point2];
index_result++;
point2++;
}
else{
result[index_result] = ar1[point1];
index_result++;
point1++;
}
}
while(point1 < m){
result[index_result] = ar1[point1];
index_result++;
point1++;
}
while(point2 < n){
answer += m - point1;
result[index_result] = ar2[point2];
index_result++;
point2++;
}
return result;
}
private static int[] mergeSort(int[] ar){
int n = ar.length;
if(n <= 1)
return ar;
int mid = n/2;
int[] ar1 = new int[mid];
int[] ar2 = new int[n-mid];
System.arraycopy(ar, 0, ar1, 0, mid);
System.arraycopy(ar, mid, ar2, 0, n-mid);
int[] sorted_ar1 = mergeSort(ar1);
int[] sorted_ar2 = mergeSort(ar2);
int[] result = Merge(sorted_ar1, sorted_ar2);
return result;
}
public static void main(String[] args) { Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] ar = new int[n];
int[] arr = new int[n];
for(int i = 0;i < n;i++){
ar[i] = in.nextInt();
arr[i]= ar[i];
}
mergeSort(arr);
quickSort(ar, 0, ar.length-1);
System.out.println(answer - swaps);
}
}

【HackerRank】Running Time of Quicksort的更多相关文章

  1. 【HackerRank】QuickSort(稳定快排,空间复杂度O(n))

    QuickSort In the previous challenge, you wrote a partition method to split an array into 2 sub-array ...

  2. 【HackerRank】How Many Substrings?

    https://www.hackerrank.com/challenges/how-many-substrings/problem 题解 似乎是被毒瘤澜澜放弃做T3的一道题(因为ASDFZ有很多人做过 ...

  3. 【hadoop】 running beyond virtual memory错误原因及解决办法

    问题描述: 在hadoop中运行应用,出现了running beyond virtual memory错误.提示如下: Container [pid=28920,containerID=contain ...

  4. 【HackerRank】Find the Median(Partition找到数组中位数)

    In the Quicksort challenges, you sorted an entire array. Sometimes, you just need specific informati ...

  5. 【HackerRank】 The Full Counting Sort

    In this challenge you need to print the data that accompanies each integer in a list. In addition, i ...

  6. 【HackerRank】 Sherlock and The Beast

    Sherlock and The Beast Sherlock Holmes is getting paranoid about Professor Moriarty, his archenemy. ...

  7. 【POJ3784】Running Median

    Running Median Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3406   Accepted: 1576 De ...

  8. 【hackerrank】Week of Code 30

    Candy Replenishing Robot Find the Minimum Number 直接模拟 Melodious password dfs输出方案 Poles 题意:有多个仓库,只能从后 ...

  9. 【hackerrank】Week of Code 26

    在jxzz上发现的一个做题网站,每周都有训练题,题目质量……前三题比较水,后面好神啊,而且类型差不多,这周似乎是计数专题…… Army Game 然后给出n*m,问需要多少个小红点能全部占领 解法:乘 ...

随机推荐

  1. Trailing Zeroes (III) 假设n!后面有x个0.现在要求的是,给定x,要求最小的n; 判断一个n!后面有多少个0,通过n/5+n/25+n/125+...

    /** 题目:Trailing Zeroes (III) 链接:https://vjudge.net/contest/154246#problem/N 题意:假设n!后面有x个0.现在要求的是,给定x ...

  2. Pairs Forming LCM 在a,b中(a,b<=n)(1 ≤ n ≤ 10^14),有多少组(a,b) (a<b)满足lcm(a,b)==n; lcm(a,b)=p1 ^ max(a1,b1) * p2 ^ max(a2,b2) *..........*pn ^ max(an,bn)

    转自:http://www.cnblogs.com/shentr/p/5285407.html http://acm.hust.edu.cn/vjudge/contest/view.action?ci ...

  3. layout折叠后显示标题

    Easyui的layout折叠后显示怎样可以显示标题 //在layout的panle全局配置中,增加一个onCollapse处理title$.extend($.fn.layout.paneldefau ...

  4. Spring MVC生成XML

    以下示例演示如何使用Spring Web MVC框架生成XML.首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发基于动态表单的Web应用程序: 创建一个名 ...

  5. flex datagrid itemrender wordwrap失效

    现在我是想把datagrid中的部分字体变个颜色. 但是重写set data函数后发现原先的wordwrap自动换行不好使了. 于是就在谷歌上找问题.. 参考了两篇: http://stackover ...

  6. hadoop2.4完全分布式部署

    hadoop2.4完全分布式部署 感谢:http://blog.csdn.net/licongcong_0224/article/details/12972889 集群组成: 两台red hat en ...

  7. 3、easyUI-创建 CRUD可创建展开行明细编辑dataGrid(表格)

    同样在上一节中讲到可以编辑的表格,现在讲一般用到的最后一个datagrid(表格)相关的展开明细可编辑的表格: 第三中表格主要应用场景在:列出表格信息,然后点击可以查看详细信息(此处是全部可以编辑,可 ...

  8. ProgressBar 进度条设置百分比显示

    rawable/progressbar <layer-list xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  9. linux下软件的安装与卸载

    一 软件安装包的类型 通常Linux应用软件的安装有五种:    1) tar+ gz包,如software-1.2.3-1.tar.gz.他是使用UNIX系统的打包工具tar打包的.    2) r ...

  10. c++获取读写文本权限

    #include<cstdio> #include<iostream> #include<fstream> using namespace std; int tot ...