既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
array[leftIndex] = array[left];
array[left] = tmp;
return leftIndex;
}
优化快速排序:
-
快排的性能受基准值的影响很大,如果我们选的基准值接近数组中的中位数,此时左右俩个区间较均衡性能也最好。
-
所以我们需要优化基准值,随机挑三个数字,取三个数字的中间值作为基准值。
实现:
//优化后的快速排序
public void betterQuickSort(int[] array) {
betterQuickSortDeal(array, 0, array.length - 1);
}
private void betterQuickSortDeal(int[] array, int left, int right) {
if(left >= right) {
return;
}
int index = betterQartition(array,left,right);
betterQuickSortDeal(array,left,index - 1);
betterQuickSortDeal(array,index + 1, right);
}
private int betterQartition(int[] array, int left, int right) {
int baseVaule = findBetterBaseVaule(array, left, right);
int leftIndex = left;
int rightIndex = right;
while (leftIndex < rightIndex) {
while (leftIndex < rightIndex && array[rightIndex] >= baseVaule) {
rightIndex --;
}
while (leftIndex < rightIndex && array[leftIndex] <= baseVaule) {
leftIndex ++;
}
if(leftIndex < rightIndex) {
int tmp = array[leftIndex];
array[leftIndex] = array[rightIndex];
array[rightIndex] = tmp;
}
}
int tmp = array[leftIndex];
array[leftIndex] = array[left];
array[left] = tmp;
return leftIndex;
}
private int findBetterBaseVaule(int[] array, int left, int right) {
if(array.length < 3) {
return array[left];
}
int[] nums = new int[3];
nums[0] = array[left];
nums[1] = array[right];
Random rand = new Random();
//选取(left,right)下标中间的一个随机值
int ra = rand.nextInt(right) + left + 1;
nums[2] = array[ra];
Arrays.sort(nums);
for (int i = 0; i < array.length; i++) {
if(array[i] == nums[1]) {
array[i] = array[left];
array[left] = nums[1];
break;
}
}
return array[left];
}
-
还有优化方式就是当我们当前这个区间数组元素个数较少时,我们直接进行插入排序,
-
再就是当我们递归达到一定深度的时候,此时待排区间还有很多时,我们使用堆排序。
归并排序-原理(稳定)(重要)
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
实现:
//归并排序
public void mergeSort(int[] array) {
//归并排序区间采用左闭右开格式,快排采用左闭右闭格式
mergeSortHealper(array, 0, array.length);
}
private void mergeSortHealper(int[] array, int left, int right) {
if(right - left <= 1) {
return;
}
int mid = (left + right) / 2;
mergeSortHealper(array,left,mid);
mergeSortHealper(array,mid,right);
merge(array,left,mid,right);
}
//将俩个有序序列合并为一个有序序列
private void merge(int[] array, int left, int mid, int right) {
int leftIndex = left;
int rightIndex = mid;
int[] tmpNums = new int[right - left];
int tmpIndex = 0;
while (leftIndex < mid && rightIndex < right) {
if(array[leftIndex] <= array[rightIndex]) {
tmpNums[tmpIndex] = array[leftIndex];
tmpIndex ++;
leftIndex ++;
}else {
tmpNums[tmpIndex] = array[rightIndex];
tmpIndex ++;
rightIndex ++;
}
}
while (leftIndex < mid) {
tmpNums[tmpIndex] = array[leftIndex];
tmpIndex ++;
leftIndex ++;
}
while (rightIndex < right) {
tmpNums[tmpIndex] = array[rightIndex];
tmpIndex ++;
rightIndex ++;
}
for (int i = 0; i < right - left; i++) {
array[left + i] = tmpNums[i];
}
}
性能分析:
-时间复杂度
O(NlogN)
-空间复杂度
O(N)
非递归实现:
思想:首先将gap=1也就是此时一组一个元素进行相邻排序合并,再将gap=2进行分组合并,依次类推,直到gap=array.length
实现:
//归并排序的非递归实现
public void mergeSortByLoop(int[] array) {
//gap表示多少个元素一组
for (int gap = 1; gap < array.length; gap *= 2) {
for (int left = 0; left < array.length; left += 2 * gap) {
int mid = left + gap;
int right = mid + gap;
//防止数据越界访问
if(mid > array.length) {
mid = array.length;
}
if(right > array.length) {
right = array.length;
}
merge(array,left,mid,right);
}
}
}
//将俩个有序序列合并为一个有序序列
private void merge(int[] array, int left, int mid, int right) {
int leftIndex = left;
int rightIndex = mid;
int[] tmpNums = new int[right - left];
int tmpIndex = 0;
while (leftIndex < mid && rightIndex < right) {
if(array[leftIndex] <= array[rightIndex]) {
tmpNums[tmpIndex] = array[leftIndex];
tmpIndex ++;
leftIndex ++;
}else {
tmpNums[tmpIndex] = array[rightIndex];
tmpIndex ++;
rightIndex ++;
}
}
while (leftIndex < mid) {
tmpNums[tmpIndex] = array[leftIndex];
tmpIndex ++;
leftIndex ++;
}
while (rightIndex < right) {
tmpNums[tmpIndex] = array[rightIndex];
tmpIndex ++;
rightIndex ++;
}
for (int i = 0; i < right - left; i++) {
array[left + i] = tmpNums[i];
}
}
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
}
for (int i = 0; i < right - left; i++) {
array[left + i] = tmpNums[i];
}
}
[外链图片转存中…(img-beHF3GWo-1714967600939)]
[外链图片转存中…(img-ACeCxgYb-1714967600939)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!