您的位置:首页 > 其它

快排、堆排序、插入法比较

2017-11-28 09:50 99 查看
快排和插入法网上有介绍,堆排序还没搞懂,简单的测试了下,实际中,快排的性能最好。

后续把堆排序搞懂后在写个文档便于复习。

————————————————————————————————————————————————————————

2017/11/28   测试例子,百万级别的用例,插入法时间性能是在太差。数组大小可以自己设置。

public class Sort {
public static void main(String[] args) {

int[] arr = new int[100000];
Random r = new Random();
for (int i = 0; i <100000 ; i++) {
arr[i] = r.nextInt(1000000000);
}
int[] arr1 = arr.clone();
int[] arr2 = arr.clone();
//测试快排时间
long time = System.currentTimeMillis();
quickSort(arr1,0,arr1.length-1);
time = System.currentTimeMillis() - time;
System.out.println("快排时间"+time);

//测试堆排时间
time = System.currentTimeMillis();
heapSort(arr2);
time = System.currentTimeMillis() - time;
System.out.println("堆排时间"+time);

//测试插入法时间
time = System.currentTimeMillis();
insertSort(arr);
time = System.currentTimeMillis() - time;
System.out.println("插入法时间"+time);

/*        //验证算法是否正确
int[] arrs = new int[]{56, 18, 6, 3, 97, 66, 8, 26, 88, 30, 99, 93};
//int[] arrs = new int[]{20,50,20,40,70,10,80,30,60};
insertSort(arrs);
quickSort(arrs,0,arrs.length-1);
heapSort(arrs);
System.out.println(Arrays.toString(arrs));*/
/*        //验证是否正确
for (int i = 0; i <100000 ; i++) {
if(arr[i]!=arr1[i]&&arr1[i]!=arr2[i]){
System.out.println("数组有不同的地方"+arr[i]+arr1[i]+arr[2]);
break;
}
if(i==arr1.length-1){
System.out.println("算法排序结果一致");
}
}*/
} public static void heapSort(int []arr){ //1.构建大顶堆 for(int i=arr.length/2-1;i>=0;i--){ //从第一个非叶子结点从下至上,从右至左调整结构 adjustHeap(arr,i,arr.length); } //2.调整堆结构+交换堆顶元素与末尾元素 for(int j=arr.length-1;j>0;j--){ swap(arr,0,j);//将堆顶元素与末尾元素进行交换 adjustHeap(arr,0,j);//重新对堆进行调整 } } public static void adjustHeap(int []arr,int i,int length){ int temp = arr[i];//先取出当前元素i for(int k=i*2+1;k<length;k=k*2+1){//从i结点的左子结点开始,也就是2i+1处开始 if(k+1<length && arr[k]<arr[k+1]){//如果左子结点小于右子结点,k指向右子结点 k++; } if(arr[k] >temp){//如果子节点大于父节点,将子节点值赋给父节点(不用进行交换) arr[i] = arr[k]; i = k; }else{ break; } } arr[i] = temp;//将temp值放到最终的位置 } public static void swap(int []arr,int a ,int b){ int temp=arr[a]; arr[a] = arr[b]; arr[b] = temp; } private static void quickSort(int[] arr,int left,int right){ if(left>right){ return; } int p = arr[left]; int i= left,j=right; while(i<j){ while(arr[j]>=p&&i<j){ j--; } while(arr[i]<=p&&i<j){ i++; } if(i<j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } arr[left] = arr[i]; arr[i] = p; quickSort(arr,left,i-1); quickSort(arr,i+1,right); } private static void insertSort(int[] arr) { if(arr==null || arr.length == 0){ return; } for (int i = 0; i <arr.length ; i++) { int temp = arr[i]; int j = i-1; while(j>=0&&arr[j]>temp){ arr[j+1] = arr[j]; j--; } arr[j+1] = temp; } }}

结果如下:

快排时间25ms

堆排时间34ms

插入法时间6500ms

算法排序结果一致

多次测量,时间有波动,原因是根据随机生成的数组(绝大原因)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐