关于快速排序的问题

Freefish1994 2016-08-16 04:24:18
为什么同样都是50个数的数组,用加注释的那组数组运行,瞬间就排序好了;用随机数生成的数组排序就特别特别慢?


package com.sort;

import java.util.Random;

public class QuickSort {

public static void main(String[] args) {
// int a[] = new int[] { 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90,
// 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79,
// 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62,
// 61, 60, 59, 58, 57, 56, 55, 54, 53,
// 52, 51, 0, 49, 48, 47, 46, 45, 44 };
//随机数生成数组
int a[] = new int[50];
for (int i = 0; i < a.length; i++) {
int m = new Random().nextInt(100);
a[i] = m;
}
System.out.println("数组长度" + a.length);
start(a);// 快速排序
// 输出排序结果
System.out.print("[ ");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println("]");
System.out.println();
}

private static void start(int a[]) {
if (a.length > 0)
quickSort(a, 0, a.length - 1);
else
System.out.println("Error:输入的数据有误!");
}

private static void quickSort(int a[], int left, int right) {
if (left < right) {
int i = getMiddleValue(a, left, right);
quickSort(a, 0, i - 1);
quickSort(a, i + 1, right);
}

}

private static int getMiddleValue(int a[], int left, int right) {
int i = left, j = right;
int key = a[left];
while (i != j) {
while (i < j && a[j] >= key) {
j--;
}
a[i] = a[j];
while (i < j && a[i] <= key) {
i++;
}
a[j] = a[i];
}
a[i] = key;
return i;
}
}


...全文
194 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
自由自在_Yu 2016-08-17
  • 打赏
  • 举报
回复
引用 9 楼 qq_27762917 的回复:
[quote=引用 8 楼 yuxiangaaaaa 的回复:] public class Test { int n = 1; public void quick_sort(int[] arrays, int lenght) { if (null == arrays || lenght < 1) { System.out.println("input error!"); return; } _quick_sort(arrays, 0, lenght - 1); } public void _quick_sort(int[] arrays, int start, int end) { if(start>=end){ return; } int i = start; int j = end; int value = arrays[i]; boolean flag = true; while (i != j) { if (flag) { if (value > arrays[j]) { swap(arrays, i, j); flag=false; } else { j--; } }else{ if(value<arrays[i]){ swap(arrays, i, j); flag=true; }else{ i++; } } } snp(arrays); _quick_sort(arrays, start, j-1); _quick_sort(arrays, i+1, end); } public void snp(int[] arrays) { System.out.print("第"+n+"次:"); for (int i = 0; i < arrays.length; i++) { System.out.print(arrays[i] + " "); } System.out.println(); n++; } private void swap(int[] arrays, int i, int j) { int temp; temp = arrays[i]; arrays[i] = arrays[j]; arrays[j] = temp; } public static void main(String args[]) { Test q = new Test(); // int[] a = { 49, 38, 65, 12, 45, 5, 89, 88, 87, 86, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32}; int a[] = new int[50]; for (int i = 0; i < a.length; i++) { int m = new Random().nextInt(100); a[i] = m; } System.out.println("数组长度" + a.length); q.quick_sort(a,a.length); } }
明白了,是我在和基准值比较的时候直接赋值过去了,而不是交换。 您能告诉我为什么用静态初始化的那组数组运行很快,随机数产生的数组运行很慢吗? 是因为错误的排序算法产生的巧合还是什么?[/quote] 是巧合了,你的数据太有规律了,从大到小的顺序排列的,随机数是没有规律的,所以很慢,你的静态数组换成没有规律的数据就会慢了。
Freefish1994 2016-08-17
  • 打赏
  • 举报
回复
引用 11 楼 qq_26508409 的回复:
[quote=引用 9 楼 qq_27762917 的回复:] [quote=引用 8 楼 yuxiangaaaaa 的回复:] public class Test { int n = 1; public void quick_sort(int[] arrays, int lenght) { if (null == arrays || lenght < 1) { System.out.println("input error!"); return; } _quick_sort(arrays, 0, lenght - 1); } public void _quick_sort(int[] arrays, int start, int end) { if(start>=end){ return; } int i = start; int j = end; int value = arrays[i]; boolean flag = true; while (i != j) { if (flag) { if (value > arrays[j]) { swap(arrays, i, j); flag=false; } else { j--; } }else{ if(value<arrays[i]){ swap(arrays, i, j); flag=true; }else{ i++; } } } snp(arrays); _quick_sort(arrays, start, j-1); _quick_sort(arrays, i+1, end); } public void snp(int[] arrays) { System.out.print("第"+n+"次:"); for (int i = 0; i < arrays.length; i++) { System.out.print(arrays[i] + " "); } System.out.println(); n++; } private void swap(int[] arrays, int i, int j) { int temp; temp = arrays[i]; arrays[i] = arrays[j]; arrays[j] = temp; } public static void main(String args[]) { Test q = new Test(); // int[] a = { 49, 38, 65, 12, 45, 5, 89, 88, 87, 86, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32}; int a[] = new int[50]; for (int i = 0; i < a.length; i++) { int m = new Random().nextInt(100); a[i] = m; } System.out.println("数组长度" + a.length); q.quick_sort(a,a.length); } }
明白了,是我在和基准值比较的时候直接赋值过去了,而不是交换。 您能告诉我为什么用静态初始化的那组数组运行很快,随机数产生的数组运行很慢吗? 是因为错误的排序算法产生的巧合还是什么?[/quote] 很快?你把第一个100和最后一个44位置换一下,一样出不来。[/quote] 还真是。。。等于是算法的错误导致的是吧。。刚才那个速度快只是凑巧而已
nikyotensai 2016-08-17
  • 打赏
  • 举报
回复
引用 9 楼 qq_27762917 的回复:
[quote=引用 8 楼 yuxiangaaaaa 的回复:] public class Test { int n = 1; public void quick_sort(int[] arrays, int lenght) { if (null == arrays || lenght < 1) { System.out.println("input error!"); return; } _quick_sort(arrays, 0, lenght - 1); } public void _quick_sort(int[] arrays, int start, int end) { if(start>=end){ return; } int i = start; int j = end; int value = arrays[i]; boolean flag = true; while (i != j) { if (flag) { if (value > arrays[j]) { swap(arrays, i, j); flag=false; } else { j--; } }else{ if(value<arrays[i]){ swap(arrays, i, j); flag=true; }else{ i++; } } } snp(arrays); _quick_sort(arrays, start, j-1); _quick_sort(arrays, i+1, end); } public void snp(int[] arrays) { System.out.print("第"+n+"次:"); for (int i = 0; i < arrays.length; i++) { System.out.print(arrays[i] + " "); } System.out.println(); n++; } private void swap(int[] arrays, int i, int j) { int temp; temp = arrays[i]; arrays[i] = arrays[j]; arrays[j] = temp; } public static void main(String args[]) { Test q = new Test(); // int[] a = { 49, 38, 65, 12, 45, 5, 89, 88, 87, 86, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32}; int a[] = new int[50]; for (int i = 0; i < a.length; i++) { int m = new Random().nextInt(100); a[i] = m; } System.out.println("数组长度" + a.length); q.quick_sort(a,a.length); } }
明白了,是我在和基准值比较的时候直接赋值过去了,而不是交换。 您能告诉我为什么用静态初始化的那组数组运行很快,随机数产生的数组运行很慢吗? 是因为错误的排序算法产生的巧合还是什么?[/quote] 很快?你把第一个100和最后一个44位置换一下,一样出不来。
nikyotensai 2016-08-17
  • 打赏
  • 举报
回复
引用 8 楼 yuxiangaaaaa 的回复:
public class Test { int n = 1; public void quick_sort(int[] arrays, int lenght) { if (null == arrays || lenght < 1) { System.out.println("input error!"); return; } _quick_sort(arrays, 0, lenght - 1); } public void _quick_sort(int[] arrays, int start, int end) { if(start>=end){ return; } int i = start; int j = end; int value = arrays[i]; boolean flag = true; while (i != j) { if (flag) { if (value > arrays[j]) { swap(arrays, i, j); flag=false; } else { j--; } }else{ if(value<arrays[i]){ swap(arrays, i, j); flag=true; }else{ i++; } } } snp(arrays); _quick_sort(arrays, start, j-1); _quick_sort(arrays, i+1, end); } public void snp(int[] arrays) { System.out.print("第"+n+"次:"); for (int i = 0; i < arrays.length; i++) { System.out.print(arrays[i] + " "); } System.out.println(); n++; } private void swap(int[] arrays, int i, int j) { int temp; temp = arrays[i]; arrays[i] = arrays[j]; arrays[j] = temp; } public static void main(String args[]) { Test q = new Test(); // int[] a = { 49, 38, 65, 12, 45, 5, 89, 88, 87, 86, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32}; int a[] = new int[50]; for (int i = 0; i < a.length; i++) { int m = new Random().nextInt(100); a[i] = m; } System.out.println("数组长度" + a.length); q.quick_sort(a,a.length); } }
厉害
Freefish1994 2016-08-17
  • 打赏
  • 举报
回复
引用 8 楼 yuxiangaaaaa 的回复:
public class Test { int n = 1; public void quick_sort(int[] arrays, int lenght) { if (null == arrays || lenght < 1) { System.out.println("input error!"); return; } _quick_sort(arrays, 0, lenght - 1); } public void _quick_sort(int[] arrays, int start, int end) { if(start>=end){ return; } int i = start; int j = end; int value = arrays[i]; boolean flag = true; while (i != j) { if (flag) { if (value > arrays[j]) { swap(arrays, i, j); flag=false; } else { j--; } }else{ if(value<arrays[i]){ swap(arrays, i, j); flag=true; }else{ i++; } } } snp(arrays); _quick_sort(arrays, start, j-1); _quick_sort(arrays, i+1, end); } public void snp(int[] arrays) { System.out.print("第"+n+"次:"); for (int i = 0; i < arrays.length; i++) { System.out.print(arrays[i] + " "); } System.out.println(); n++; } private void swap(int[] arrays, int i, int j) { int temp; temp = arrays[i]; arrays[i] = arrays[j]; arrays[j] = temp; } public static void main(String args[]) { Test q = new Test(); // int[] a = { 49, 38, 65, 12, 45, 5, 89, 88, 87, 86, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32}; int a[] = new int[50]; for (int i = 0; i < a.length; i++) { int m = new Random().nextInt(100); a[i] = m; } System.out.println("数组长度" + a.length); q.quick_sort(a,a.length); } }
明白了,是我在和基准值比较的时候直接赋值过去了,而不是交换。 您能告诉我为什么用静态初始化的那组数组运行很快,随机数产生的数组运行很慢吗? 是因为错误的排序算法产生的巧合还是什么?
自由自在_Yu 2016-08-17
  • 打赏
  • 举报
回复
public class Test { int n = 1; public void quick_sort(int[] arrays, int lenght) { if (null == arrays || lenght < 1) { System.out.println("input error!"); return; } _quick_sort(arrays, 0, lenght - 1); } public void _quick_sort(int[] arrays, int start, int end) { if(start>=end){ return; } int i = start; int j = end; int value = arrays[i]; boolean flag = true; while (i != j) { if (flag) { if (value > arrays[j]) { swap(arrays, i, j); flag=false; } else { j--; } }else{ if(value<arrays[i]){ swap(arrays, i, j); flag=true; }else{ i++; } } } snp(arrays); _quick_sort(arrays, start, j-1); _quick_sort(arrays, i+1, end); } public void snp(int[] arrays) { System.out.print("第"+n+"次:"); for (int i = 0; i < arrays.length; i++) { System.out.print(arrays[i] + " "); } System.out.println(); n++; } private void swap(int[] arrays, int i, int j) { int temp; temp = arrays[i]; arrays[i] = arrays[j]; arrays[j] = temp; } public static void main(String args[]) { Test q = new Test(); // int[] a = { 49, 38, 65, 12, 45, 5, 89, 88, 87, 86, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32}; int a[] = new int[50]; for (int i = 0; i < a.length; i++) { int m = new Random().nextInt(100); a[i] = m; } System.out.println("数组长度" + a.length); q.quick_sort(a,a.length); } }
自由自在_Yu 2016-08-17
  • 打赏
  • 举报
回复
你的编写思路是错误的, int i = left, j = right; int key = a[left]; while (i != j) { while (i < j && a[j] >= key) { j--; } a[i] = a[j]; while (i < j && a[i] <= key) { i++; } a[j] = a[i]; } a[i] = key; return i;
Freefish1994 2016-08-17
  • 打赏
  • 举报
回复
引用 13 楼 yuxiangaaaaa 的回复:
[quote=引用 9 楼 qq_27762917 的回复:] [quote=引用 8 楼 yuxiangaaaaa 的回复:] public class Test { int n = 1; public void quick_sort(int[] arrays, int lenght) { if (null == arrays || lenght < 1) { System.out.println("input error!"); return; } _quick_sort(arrays, 0, lenght - 1); } public void _quick_sort(int[] arrays, int start, int end) { if(start>=end){ return; } int i = start; int j = end; int value = arrays[i]; boolean flag = true; while (i != j) { if (flag) { if (value > arrays[j]) { swap(arrays, i, j); flag=false; } else { j--; } }else{ if(value<arrays[i]){ swap(arrays, i, j); flag=true; }else{ i++; } } } snp(arrays); _quick_sort(arrays, start, j-1); _quick_sort(arrays, i+1, end); } public void snp(int[] arrays) { System.out.print("第"+n+"次:"); for (int i = 0; i < arrays.length; i++) { System.out.print(arrays[i] + " "); } System.out.println(); n++; } private void swap(int[] arrays, int i, int j) { int temp; temp = arrays[i]; arrays[i] = arrays[j]; arrays[j] = temp; } public static void main(String args[]) { Test q = new Test(); // int[] a = { 49, 38, 65, 12, 45, 5, 89, 88, 87, 86, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32, // 85, 84, 83, 82, 81, 80, 79, 34, 55, 32}; int a[] = new int[50]; for (int i = 0; i < a.length; i++) { int m = new Random().nextInt(100); a[i] = m; } System.out.println("数组长度" + a.length); q.quick_sort(a,a.length); } }
明白了,是我在和基准值比较的时候直接赋值过去了,而不是交换。 您能告诉我为什么用静态初始化的那组数组运行很快,随机数产生的数组运行很慢吗? 是因为错误的排序算法产生的巧合还是什么?[/quote] 是巧合了,你的数据太有规律了,从大到小的顺序排列的,随机数是没有规律的,所以很慢,你的静态数组换成没有规律的数据就会慢了。[/quote] 我好像找出问题了,好像是递归调用的那两行代码写错了(40,41行) 应该改成 quickSort(a, left, i - 1); quickSort(a, i + 1, right);
Freefish1994 2016-08-16
  • 打赏
  • 举报
回复
引用 4 楼 yuxiangaaaaa 的回复:
你确定注释的那组数组运行,瞬间就排序好了? 我试了一下 ,超过35就很慢了,50个就跑不完
问题就在随机数那个40左右就很慢,可是静态初始化那个,50个数,却非常快就运行好了
Freefish1994 2016-08-16
  • 打赏
  • 举报
回复
引用 4 楼 yuxiangaaaaa 的回复:
你确定注释的那组数组运行,瞬间就排序好了? 我试了一下 ,超过35就很慢了,50个就跑不完
你是不是用的是随机数那个生成的? 静态初始化的那组数是50个,瞬间就运行好了啊
自由自在_Yu 2016-08-16
  • 打赏
  • 举报
回复
你确定注释的那组数组运行,瞬间就排序好了? 我试了一下 ,超过35就很慢了,50个就跑不完
Freefish1994 2016-08-16
  • 打赏
  • 举报
回复
引用 1 楼 qnmdcsdn 的回复:
在方法前后打印一下时间,定位一下哪里耗时长
如果是我排序算法写得有毛病,那一般的数组排序时候也应该时间很长才对,可实际是很快排序好了。
Freefish1994 2016-08-16
  • 打赏
  • 举报
回复
引用 1 楼 qnmdcsdn 的回复:
在方法前后打印一下时间,定位一下哪里耗时长
已经算过时间了,是从开始排序后开始时间变长的,如果去掉第20行代码(start(a)),一下子就出来了,可是如果不是随机数的数组又不会在排序算法时耗费很长时间,这是为什么?
  • 打赏
  • 举报
回复
在方法前后打印一下时间,定位一下哪里耗时长

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧