快速排序的「快」是因為使用了「分治法」,使其時間複雜度降低到了(nlogn)
/**
* @author qucg
* @version 2019/5/19
* @description 快速排序,快速排序的「快」是因為使用了「分治法」
*/public class quicksort
// 得到基準元素位置
int pivotindex = partition(arr, startindex, endindex);
// 根據基準元素,分成兩部分進行遞迴排序
quicksort(arr, startindex, pivotindex - 1);
quicksort(arr, pivotindex + 1, endindex);
}/**
* 分治(雙邊迴圈法)
** @param arr 待交換的陣列
* @param startindex 起始下標
* @param endindex 結束下標
* @return 重疊的索引
*/private static int partition(int arr, int startindex, int endindex)
// left右移
while (left < right && arr[left] <= pivot)
// 交換left和right指標所指向的元素
if (left < right)
}// pivot和指標重合點交換
arr[startindex] = arr[left];
arr[left] = pivot;
return left;
}public static void main(string args) ;
quicksort(arr, 0,arr.length-1);
system.out.println(arrays.tostring(arr));
}}
/**
* @author qcg
* @version 2019/5/21.
* @description 單邊快速排序實現
* 確定兩個元素:
* 1.pivot基準
* 2.mark指標指向代表小於基準元素的邊界
* 基本思路:
* 1.每個陣列元素和基準值去比較
* 2.如果陣列元素小於基準元素:
* 2.1 mark++
* 2.2 將mark指向的元素與該陣列元素交換
* 3.以mark指向的元素為準,左右陣列分別重複第一步
*/public class singlesidequicksort
// 得到基準元素位置
int pivotindex = partition(arr, startindex, endindex);
// 根據基準元素,分成兩部分進行遞迴排序
quicksort(arr, startindex, pivotindex - 1);
quicksort(arr, pivotindex + 1, endindex);
}/**
* 分治(單邊迴圈法)
** @param arr 待交換的陣列
* @param startindex 起始下標
* @param endindex 結束下標
* @return 小於基準元素的邊界
*/private static int partition(int arr, int startindex, int endindex)
}// mark指向的元素和pivot交換
arr[startindex] = arr[mark];
arr[mark] = pivot;
return mark;
}// 第一輪排序:[1, 3, 2, 4, 4, 6, 8, 5]
public static void main(string args) ;
quicksort(arr, 0, arr.length - 1);
system.out.println(arrays.tostring(arr));
}}
/**
* @author qucg
* @version 2019/5/21
* @description 非遞迴實現的快速排序
*/public class nonrecursivequicksort
if (pivotindex + 1 < param.get("endindex")) }}
/*** 分治 (單邊迴圈法)
** @param arr 待交換的陣列
* @param startindex 起始下標
* @param endindex 結束下標
* @return 邊界
*/private static int partition(int arr, int startindex, int endindex)
}// 交換mark指向的元素與pivot
arr[startindex] = arr[mark];
arr[mark] = pivot;
return mark;
}public static void main(string args) ;
quicksort(arr,0,arr.length-1);
system.out.println(arrays.tostring(arr));
}}
因為其快的特點,常常用於大規模的資料排序場景 快速排序實現
1.結束條件 low high 2.快速排序要分而治之。故需要分的位置,位置便是當前元素經過排列後應該所在的位置。3.對於單次的排列,都使得乙個元素排在了正確的位置,她的左面比她小,右側比她大。package com.jue.quicksort public class quicksort logs...
實現 快速排序
快速排序的基本思想 1 先從數列中選擇乙個數作為基準數 一般會把陣列中最左邊的數當做基準數 2 然後從數列兩邊進行檢索 先從右邊檢索比基準數小的,再從左邊檢索比基準數大的 如果檢索到了,就停下,然後交換這兩個元素。然後再繼續檢索。3 直到左檢索和右檢索相遇,把基準數和相遇位置的數交換。4 第一輪檢索...
快速排序實現
快速排序的基本思想是 通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,從而使全部的資料有序。快排的平均時間複雜度是o nlogn 最壞是o n 2 1 public class ...