排序优化(排序优化问题)
本文目录一览:
排序一 几种冒泡排序的比较和优化
package com.asin.algorithm;
import java.util.Arrays;
public class 芦芦BubbleSort {
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = 世段arr[j];
arr[j] = temp;
}
/**
* 最简单的排序实现
*
* 当i = 1, j = 8时,虽然把2排到前面了,但是也把3排到了最后,陪返带效率非常低
*/
private static void sort1(int[] arr) {
int sumSwap = 0, sumIn = 0, sumOut = 0;
for (int i = 0; i arr.length; i++) {
for (int j = i + 1; j arr.length; j++) {
if (arr[i] arr[j]) {
swap(arr, i, j);
sumSwap++;
}
sumIn++;
}
sumOut++;
}
System.out.println("sort1执行次数:sumSwap:" + sumSwap + " sumIn:" + sumIn + " sumOut:" + sumOut);
System.out.println(Arrays.toString(arr));
}
/**
* 冒泡排序,从底往上遍历
*
* 当i=2时,把4往前排了,还把3往前排了,最终把2排到第二位
*/
private static void sort2(int[] arr) {
int sumSwap = 0, sumIn = 0, sumOut = 0;
for (int i = 0; i arr.length; i++) {
for (int j = arr.length - 1; j i; j--) {
if (arr[j - 1] arr[j]) {
swap(arr, j - 1, j);
sumSwap++;
}
sumIn++;
}
sumOut++;
}
System.out.println("sort2执行次数:sumSwap:" + sumSwap + " sumIn:" + sumIn + " sumOut:" + sumOut);
System.out.println(Arrays.toString(arr));
}
/**
* 冒泡排序优化,避免了已经是有序的情况下的无意义的循环
*
* 9, 1, 5, 8, 3, 7, 4, 6, 2
*
* 2, 1, 3, 4, 5, 6, 7, 8, 9 这种情况下,只需要把2和1交换
*/
private static void sort3(int[] arr) {
int sumSwap = 0, sumIn = 0, sumOut = 0;
boolean flag = true;
for (int i = 0; i arr.length flag; i++) {// i arr.length flag
flag = false;
for (int j = arr.length - 1; j i; j--) {
if (arr[j - 1] arr[j]) {// 数组是否有序
swap(arr, j - 1, j);
flag = true;// 交换后,再判断
sumSwap++;
}
sumIn++;
}
sumOut++;
}
System.out.println("sort3执行次数:sumSwap:" + sumSwap + " sumIn:" + sumIn + " sumOut:" + sumOut);
System.out.println(Arrays.toString(arr));
}
/**
* 测试比较混乱的数组
*/
private static void arr1() {
int[] arr1 = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
sort1(arr1);
int[] arr2 = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
sort2(arr2);
int[] arr3 = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
sort3(arr3);
}
/**
* 测试不太混乱的数组
*/
private static void arr2() {
int[] arr1 = { 2, 1, 3, 4, 5, 6, 7, 8, 9 };
sort1(arr1);
int[] arr2 = { 2, 1, 3, 4, 5, 6, 7, 8, 9 };
sort2(arr2);
int[] arr3 = { 2, 1, 3, 4, 5, 6, 7, 8, 9 };
sort3(arr3);
}
public static void main(String[] args) {
arr1();// 比较混乱的数组
arr2();// 不太混乱的数组
}

MySQL 排序优化
2.1 排序方式
数据量小则在内存排序, 数据量大则使用磁盘排配拿序
内存排序 : 直接使用"快速排序"
磁盘排序 : 先将数据分块, 对每个独立的块使用"快速排序", 并将各个块的排序结果存在磁盘上, 然后将各个排好序的块进行培简搭合并(merge), 最后返回排序咐咐结果
2.2 排序算法
3. 注意点 :
MySQL 查询优化(六): MySQL 的查询优化排序优化机制
对链告结果进行排序操作的代价可能很高,因此可以通过避免排序或让参与排序的数据行更少来优化查询性能。
当 MySQL 不能使用索引产生有序结果时,它必须对数据行进行排序。这有可能是在内存中进行也可能是在磁盘进行,但 MySQL 始终将这个过程称之为 filesort,即便实际上并没有使用一个文件。
如果用于排序的值可以一次性放入排序缓存中,MySQL 可以在内存中使用快排算法进行排序。如果 MySQL 不能在内存中进行排序,则会在磁盘中按块逐块排序。它对每个块使用快排算法,然后在将这些排序好的块合并到结果中。
有两个文件排序(filesort)算法:
很难说哪种算法更有效,对每个算法来说都会有最优和最坏案例。MySQL 在数据表全部列加上用于排序的列的大小不超过 max_length_for_sort_data 时会使用单次遍历算法。可以通过修改这个参数影响排序算法的选择。
需要注意的是,MySQL 的 filesort使用的临时存储空间可能会超出你的预期,这是因为它对每个排序元素都分配了固定大小的存储空间。这些存储空间要足够大以便容下存储最大的元素,而且 VARCHAR这类字段使用的是对应的最大长度。而且,如果使用的是 UTF-8字符集,MuSQL 会对每个字符分配3个字节。结果是,我们会发现那些没怎么优化的查询会导致磁盘上的临时存储空间是数据表自身存储空间的好几倍。
而在对联合查询进行排序时,MySQL 可能会在查询执行过程中执行两次文件排序。如果 ORDER BY 子句只是引用联合查询的第一张表,MySQL 可以先对这个表进行文件排序,然后再处理联合查询。如果是这种情况,在 EXPLAIN 时会在 Extra 字段显示“Using filesort”。而对于其他的排序情况——例如排序不是针对第一张表,或者是 ORDER BY 使用的列对应了不止一个数据表,MySQL 必须使用临时表缓存查询结果,然而在联合查询完成后,再对临时表进行文件排序。在这种情况下,EXPLAIN 会在 Extra 字段显示“Using temorary; Using filesort”。如果包含 LIMIT 约束的话,会发生在文件排序棚卜明后,因此临时表和文件排序的存储空间可能非常弊碰大。
MySQL 5.6在只需要对数据行的子集(例如 LIMIT)进行排序时,引入了一个重大改进。相对于对整个结果集进行排序再返回部分数据,MySQL 有时候会在排序的时候直接丢弃掉不需要的数据行来提高效率。不管怎么样,排序也需要小心使用,很可能会导致存储占用的飙升最终导致系统负荷过大。
排序优化的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于排序优化问题、排序优化的信息别忘了在云尚网络www.ysfad.net进行查找喔。
发表评论




暂时没有评论,来抢沙发吧~