切割的思想是高速排序最精髓的地方。每一次切割出来的元素K一个排在第K位,所以利用这样的思想我们至少知道3点

1. 被切割出来的元素K最后一定排在第K位。

2. 在K左边的元素一定比K小或者相等。

3. 在K右边的元素一定比K大或者相等。

所以我们能够通过这些性质定位到随意一个元素。

比方我们partition完一个数组后,得到A={5,3,4,2,6,8,10,12,11,9}

A[K]=8,所以我们知道排好序后的A[5]=8, A[4]一定在8左边,A[6]一定在8右边

所以,我们一定知道8这个数是数组里第5+1小的数。第10-5大的数

所以我们得出 假设切割出来的数A[K]=X, 那么X一定是数组里的第K+1位,也就是第K+1小的数

假设数组的长度为N,那么X就是数组里第N-K大的数

以下是切割的代码

	public static int partition(int[] array, int left, int right) {
int i = left;
int j = right + 1; while (true) { while (more(array[left], array[++i]))
if (i == right)
break;
while (more(array[--j], array[left]))
if (j == left)
break; if (i >= j)
break;
exchange(array, i, j);
}
exchange(array, left, j);
return j;
}

接下来就是怎样在切割后定位其它的元素了?

假设我们定位了A[K]=X,发现目标元素O比X大,那么就在右边找,left=K+1,假设比X小,那么就在左边找。right=K-1,否则定位成功

	public static int select(int[] array, int k) {
int left = 0;
int right = array.length - 1;
while (left < right) {
int j = partition(array, left, right);
if (j < k)
left = j + 1;
else if (j > k)
right = j - 1;
else
return array[k];
}
return array[k];
}

以下给出完整代码,仅供大家參考

	// compare
public static boolean more(int v, int w) {
return v > w;
} // exchange
public static void exchange(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
} public static int partition(int[] array, int left, int right) {
int i = left;
int j = right + 1; while (true) { while (more(array[left], array[++i]))
if (i == right)
break;
while (more(array[--j], array[left]))
if (j == left)
break; if (i >= j)
break;
exchange(array, i, j);
}
exchange(array, left, j);
return j;
} public static int select(int[] array, int k) {
int left = 0;
int right = array.length - 1;
while (left < right) {
int j = partition(array, left, right);
if (j < k)
left = j + 1;
else if (j > k)
right = j - 1;
else
return array[k];
}
return array[k];
}

最新文章

  1. OX中修改文件名
  2. iframe父页面获取子页面的高度
  3. 【转】CSS3的REM设置字体大小
  4. SQL 大数据查询如何进行优化?
  5. CSS3卷角
  6. JavaScript之六种排序法
  7. JS判断RadioButtonList是否有选中项
  8. WildFly8.1(JBoss)+mod_cluster(Apache)群集配置
  9. sql server 字符串替换函数REPLACE
  10. 页面性能优化的利器 — Timeline
  11. OpenCV探索之路(二十五):制作简易的图像标注小工具
  12. web打印总结
  13. E. Neko and Flashback
  14. 通过js或jq增加的代码,点击事件或其他一些事件不起作用时
  15. 2017Nowcoder Girl D - 打车
  16. DataTable插件报错:Uncaught TypeError: Cannot read property &#39;style&#39; of undefined
  17. IDEA中读取 resource目录下文件
  18. oracle新建表空间与用户
  19. UVA 11488 Hyper Prefix Sets (字典树)
  20. Spring Boot 揭秘与实战(三) 日志框架篇 - 如何快速集成日志系统

热门文章

  1. 急速安装Ubuntu/windows双操作系统
  2. Java EE 学习:使用 idea2017 搭建 SSM 框架
  3. UltraEdit快捷键大全-UltraEdit常用快捷键大全
  4. 【HDOJ5517】Triple(二维BIT)
  5. 【Vue起步-Windows】N01:环境安装
  6. JavaScript内部是这样运行
  7. 【程序打包工具 Inno Setup】转
  8. hdu 5056(尺取法思路题)
  9. hdu 4519(数学题)
  10. ngrx/store effects 使用总结2:列表展示