A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 惜别的海岸 中级黑马   /  2013-5-17 00:16  /  1724 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我想问一下在java中是哪种排序算法的执行效率是最高的,可以说明原因吗?

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 java冬冬 于 2013-5-17 00:31 编辑

不同的情况当然要找适合的排序方法才能更有效,不过我下面验证了几种排序方法
list插入排序 > 数组插入排序 > 快速排序>选择排序> >  冒泡排序{:soso_e152:}
  1. public static void bubbleSort(int a[]) {
  2. int len = a.length;
  3. for (int i = 0; i < len - 1; i++) {
  4. for (int j = 0; j < len - 1 - i; j++) {
  5. if (a[j] > a[j + 1]) {
  6. int temp = a[j];
  7. a[j] = a[j + 1];
  8. a[j + 1] = temp; }
  9. }
  10. }
  11. }
  12. public static void selectSort(int a[]) {
  13. int temp = 0;
  14. int len = a.length;
  15. for (int i = 0; i < len - 1; i++) {
  16. int min = a[i];
  17. int index = i;
  18. for (int j = i + 1; j < len; j++) {
  19. if (min > a[j]) {
  20. min = a[j];
  21. index = j;
  22. }
  23. }
  24. temp = a[i];
  25. a[i] = a[index];
  26. a[index] = temp;
  27. }
  28. }
  29. public static void insertSort(int a[]) {
  30. int len = a.length;
  31. for (int i = 1; i < len; i++) {
  32. int temp = a[i];// 待插入的值
  33. int index = i;// 待插入的位置
  34. while (index > 0 && a[index - 1] > temp) {
  35. a[index] = a[index - 1];// 待插入的位置重新赋更大的值
  36. index--;// 位置往前移
  37. }
  38. a[index] = temp;
  39. }
  40. }
  41. public static int partition(int a[], int low, int height) {
  42. int key = a[low];
  43. while (low < height) {
  44. while (low < height && a[height] >= key)
  45. height--;
  46. a[low] = a[height];
  47. while (low < height && a[low] <= key)
  48. low++;
  49. a[height] = a[low];
  50. }
  51. a[low] = key;
  52. return low;
  53. }
  54. public static void quickSort(int a[], int low, int height) {
  55. if (low < height) {
  56. int result = partition(a, low, height);
  57. quickSort(a, low, result - 1);
  58. quickSort(a, result + 1, height);
  59. }
  60. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Sword + 1 最好代码上写好注释,这样看的比较清晰.

查看全部评分

回复 使用道具 举报
冒泡排序
回复 使用道具 举报
二叉树  排序是最快的 因为它每次排序 都是找中间的 数字  假设有这么一个数组

1 3 5  6 8  9  10

你要查找10在哪里 如果是冒泡或者选择排序 你都要对比好几遍  而二叉树

排序 从中间的6开始查找  当第一次查找的6 比10小 就排除左边的数据 第二次查找选择9 继续排除 左边数据
第三次就查找到10这个你要找的数字 也就是说其他排序要好几次 它基本就只要3次就能查到它要找的数据

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
我感觉java提供的快速排序方法可很高效的实现排序。
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j -- ),找到第一个小于key的值A[j],A[i]与A[j]交换;
4)从i开始向后搜索,即由前开始向后搜索(i ++ ),找到第一个大于key的A[i],A[i]与A[j]交换;
5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后令循环结束。

下面举例说明:

public class QuickSort
{
public static void main(String[] ary)
{
int[] arry = {49, 38, 65, 97, 76, 13, 27};
sort(arry, 0, arry.length - 1);
}
/**
* 一次排序单元,完成此方法,key左边都比key小,key右边都比key大。
* @param array 排序数组
* @param low 排序起始位置
* @param high 排序结束位置
* @return 单元排序后的数组
*/
private static int sortUnit(int[] array, int low, int high)
{
int key = array[low];
while (low < high)
{
//从后向前搜索比key小的值
while (array[high] >= key && high > low){
--high;
}
//比key小的放左边
array[low] = array[high];
//从前向后搜索比key大的值,比key大的放右边
while (array[low] <= key && high > low){
++low;
}
//比key大的放右边
array[high] = array[low];
System.out.println(low + "," + high);
}
//左边都比key小,右边都比key大。将key放在游标当前位置。此时low等于high
array[high] = key;
System.out.println(Arrays.toString(array));
return high;
}
/**
* 快速排序
* @param arry
* @return
*/
public static void sort(int[] array, int low, int high)
{
if (low >= high)
{
return;
}
//完成一次单元排序
int index = sortUnit(array, low, high);
//对左边单元进行排序
sort(array, low, index - 1);
//对右边单元进行排序
sort(array, index + 1, high);
}
}


希望对楼主有所帮助。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马