`
esffor
  • 浏览: 1351836 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

快速排序List的通用方法

阅读更多
导读:
  
  
  
  
  
  /** *//**
  
  * 快速排序列表中的元素,List中的元素必须实现了Comparable接口
  
  
  *
  
  
  * @param list
  
  
  * 列表
  
  
  * @param fromIndex
  
  
  * 左索引(排序开始索引)
  
  
  * @param toIndex
  
  
  * 右索引(排序结束结束索引)
  
  
  * @throws Exception
  
  
  */
  
  public static void quickSortList(List<comparable> list, int fromIndex, int toIndex)
  
  
  
  
  throws Exception ...{
  
  
  int tempFromIndex = fromIndex; // 左索引
  
  int tempToIndex = toIndex; // 右索引
  
  Comparable midElement; // 分割元素
  
  Comparable tempElement; // 临时变量,存储所取的列表中的元素
  
  
  
  
  
  if (toIndex > fromIndex) ...{
  
  
  
  
  
  
  /**//*
  
  * 取列表中间索引的值的对象作为分割元素
  
  
  */
  
  midElement = (Comparable) list.get((fromIndex + toIndex) / 2);
  
  
  
  
  // 循环列表直到索引交叉
  
  
  
  while (tempFromIndex <= tempToIndex) ...{
  
  
  
  
  /**//*
  
  * 从左索引方向开始找到第一个大于或等于分割元素的元素
  
  
  */
  
  
  
  while (tempFromIndex < toIndex) ...{
  
  
  tempElement = (Comparable) list.get(tempFromIndex);
  
  
  if (tempElement.compareTo(midElement) < 0)
  
  
  ++tempFromIndex;
  
  
  else
  
  break
  
  }
  
  
  
  
  
  /**//*
  
  * 从右索引方向开始找到第一个小于或等于分割元素的的元素
  
  
  */
  
  
  
  while (tempToIndex > fromIndex) ...{
  
  
  tempElement = (Comparable) list.get(tempToIndex);
  
  
  if (tempElement.compareTo(midElement) > 0)
  
  
  --tempToIndex;
  
  
  else
  
  break
  
  }
  
  
  
  // 如果索引没有交叉则交换两个对象位置
  
  
  
  if (tempFromIndex <= tempToIndex) ...{
  
  
  swap(list, tempFromIndex, tempToIndex);
  
  
  
  
  ++tempFromIndex;
  
  
  --tempToIndex;
  
  
  }
  
  }
  
  
  
  
  
  /**//*
  
  * 如果右索引没有到达左索引,则排序左边区域
  
  
  */
  
  if (fromIndex < tempToIndex)
  
  
  quickSortList(list, fromIndex, tempToIndex);
  
  
  
  
  
  
  /**//*
  
  *
  
  
  * 如果左索引没有到达右索引,则排序右边区域
  
  
  */
  
  if (tempFromIndex < toIndex)
  
  
  quickSortList(list, tempFromIndex, toIndex);
  
  
  
  
  }
  
  }
  
  
  
  
  
  /** *//**
  
  * 交换列表中的两个位置的对象
  
  
  *
  
  
  * @param list
  
  
  * 列表
  
  
  * @param i
  
  
  * 索引
  
  
  * @param j
  
  
  * 索引
  
  
  */
  
  
  
  private static void swap(List list, int i, int j) ...{
  
  
  Object io = list.get(i);
  
  
  Object jo = list.get(j);
  
  
  
  
  list.remove(i);
  
  
  list.add(i, jo);
  
  
  
  
  
  list.remove(j);
  
  
  list.add(j, io);
  
  
  }
  Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1896685

本文转自
http://blog.csdn.net/mrshan/archive/2007/11/21/1896685.aspx
分享到:
评论

相关推荐

    java中list、set和map 的区别

    List按对象进入的顺序保存对象,不做排序或...  实际上有两种List: 一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的LinkedList,它并不是为快速随机访问设计的,而是具有一套更通用的方法。  L

    C语言通用范例开发金典.part1.rar

    范例1-85 一趟快速排序的改进算法 248 ∷相关函数:QuickSort函数 1.5.10 简单选择排序 250 范例1-86 简单选择排序 250 ∷相关函数:SelectSort函数 1.5.11 箱子排序 252 范例1-87 箱子排序 252 ∷相关函数:...

    C语言通用范例开发金典.part2.rar

    范例1-85 一趟快速排序的改进算法 248 ∷相关函数:QuickSort函数 1.5.10 简单选择排序 250 范例1-86 简单选择排序 250 ∷相关函数:SelectSort函数 1.5.11 箱子排序 252 范例1-87 箱子排序 252 ∷相关函数:...

    超级有影响力霸气的Java面试题大全文档

    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 13、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 14、...

    java 面试题 总结

    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 11、HashMap...

    listview基本用法

    TListView组件使用方法 引用CommCtrl单元 procedure TForm1.Button1Click(Sender: TObject); begin ListView_DeleteColumn(MyListView.Handle, i);//i是要删除的列的序号,从0开始 end; 用LISTVIEW...

    freemarker总结

    list指令是一个迭代输出指令,用于迭代输出数据模型中的集合,list指令的语法格式如下: &lt;#list sequence as item&gt; ... &lt;/#list&gt; 上面的语法格式中,sequence就是一个集合对象,也可以是一个表达式,但该表达式将返回...

    C 开发金典

    范例1-85 一趟快速排序的改进算法 248 ∷相关函数:QuickSort函数 1.5.10 简单选择排序 250 范例1-86 简单选择排序 250 ∷相关函数:SelectSort函数 1.5.11 箱子排序 252 范例1-87 箱子排序 252 ∷相关函数:...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    20.2.3 排序、分组和聚合数据 366 20.2.4 联接数据 368 20.2.5 使用查询操作符 370 20.2.6 查询tree(titem)对象中的数据 372 20.2.7 linq和推迟求值 377 第20章快速参考 380 第21章 操作符重载 383 21.1 理解...

    asp.net知识库

    可按任意字段排序的分页存储过程(不用临时表的方法,不看全文会后悔) 常用sql存储过程集锦 存储过程中实现类似split功能(charindex) 通过查询系统表得到纵向的表结构 将数据库表中的数据生成Insert脚本的存储过程!!! ...

    编程新手真言......

    6.19 快速排序思想 130 6.20 数据结构之数组 131 6.21 数据结构的抽象名字 132 6.22 真正的ADT 133 6.23 Vector的观点 135 6.24 真正的数据结构 136 6.25 堆栈与队列 138 6.26 真正的递归 140 6.27 树与单链表,图 ...

    vb控件开发 开发ocx

    VB与MS-Draw开发通用作图软件 19 , 19.txt VB中APP对象及其应用 20 , 20.txt VB中list控件的功能扩充 21 , 21.txt VB中防止将重复项目添加到列表框控件中 22 , 22.txt VB中用Multimedia MCI控件开发多媒体应用 23 , ...

    asp.net专家疑难解答200问源码

    147.如何使用DataReader快速访问SQL Server数据 148.如何使用DataAdapter将数据填充到DataSet并显示出来 149.如何使用DataTable对象存储数据库表 150.如何对DataTable进行检索和排序 151.如何使用DataView进行...

    c++运动会评分系统

    该系统可以迅速规范的统计出运动员间的分数对比,及时进行名次排列,特别是在各学校之间的对比总分和排名,能快速且准确的描述了各个团体的实力对比,输入学校、运动员名后就可以快速的进行登记处理,在我们的传统...

    Visual C++2010开发权威指南(共三部分).part1.rar

    5.4.8 在列表控件中滚动、排列、排序和查找 205 5.4.9 在列表控件中实现工作区 205 5.4.10 处理列表控件中的通知消息 206 5.4.11 更改列表控件样式 206 5.4.12 虚拟列表控件 207 5.4.13 列表控件的消息映射 209 ...

    传智播客扫地僧视频讲义源码

    06_学员学习标准_排序及问题抛出 07_数组做函数参数退化问题剖析_传智扫地僧 08_数据类型基础提高 09_数据类型引申和思考 10_变量本质剖析和内存四区模型引出_传智扫地僧 11_c的学习重理解到位_对初学者_传智扫地僧 ...

    asp.net专家疑难解答200问

    如何使用DataReader快速访问SQL Server数据 148.如何使用DataAdapter将数据填充到DataSet并显示出来 149.如何使用DataTable对象存储数据库表 150.如何对DataTable进行检索和排序 151.如何使用...

Global site tag (gtag.js) - Google Analytics