一切为了暑期实习,一切为了暑期实习。
我就是试着去面面,实习是不可能实习的,老板是不会让我们去的。
哭!!!
以下是正题!!!
2019年3月11日:突然想做成一个整理笔记了,那这个就作为开篇吧~
以下排序排名有先后之分,请注意复习策略~
快排特别重要!!!
快排特别重要!!!
快排特别重要!!!
package algorithm;
public class QuickSort {
public static void main(String[] args) {
int[] arr={49,38,65,97};
int low = 0, high = arr.length-1;
quickSort(arr,low,high);
for(int i=0;i<arr.length;i++)
System.out.println(arr[i]);
}
public static void quickSort(int[] arr, int low, int high) {
if(low >= high) return;
int index = partition(arr,low,high);
quickSort(arr,low,index-1);
quickSort(arr,index+1,high);
}
public static int partition(int[] arr, int low, int high) {
int key = arr[low];
while(low < high) {
while(low < high && arr[high] >= key) high --;
arr[low] = arr[high];
while(low < high && arr[low] <= key) low ++;
arr[high] = arr[low];
}
arr[high] = key;
return high;
}
}
package leetcoode;
import java.util.Stack;
public class QuickSort {
public static void main(String[] args) {
int[] arr={49,38,65,97};
int low = 0, high = arr.length-1;
quickSort(arr,low,high);
for(int i=0;i<arr.length;i++)
System.out.println(arr[i]);
}
public static void quickSort(int[] arr, int low, int high) {
if(low >= high) return;
Stack<Integer> stack = new Stack<Integer>();
if(low < high) {
stack.push(low);
stack.push(high);
while(!stack.isEmpty()) {
int right = stack.pop();
int left = stack.pop();
int pivot = partition(arr,left,right);
if(pivot-1 > left) {
stack.push(low);
stack.push(pivot-1);
}
if(pivot+1 < right) {
stack.push(pivot+1);
stack.push(right);
}
}
}
}
public static int partition(int[] arr, int low, int high) {
int key = arr[low];
while(low < high) {
while(low < high && arr[high] >= key) high --;
arr[low] = arr[high];
while(low < high && arr[low] <= key) low ++;
arr[high] = arr[low];
}
arr[high] = key;
return high;
}
}
详细的看这里:https://blog.csdn.net/hacker00011000/article/details/52176100
我看有的面经上有问到这个,赶紧总结下:
(回答的时候别给自己挖坑,选自己能实现的回答)
相邻两节点进行比较,大的向后移一个,经过第一轮两两比较和移动,最大的元素移动到了最后,第二轮次大的位于倒数第二个,依次进行。
package algorithm;
public class BubbleSort {
public static void main(String[] args) {
int[] arr={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
bubbleSort(arr);
for(int i=0;i<arr.length;i++)
System.out.println(arr[i]);
}
public static void bubbleSort(int[] arr) {
for(int i=0;i<arr.length-1;i++) {
for(int j=0;j<arr.length-1-i;j++) {
if(arr[j]>arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
}
堆排序我觉得可能是最复杂的一种排序方式了,涉及了堆、完全二叉树的一些性质,就不细说了,大家参考下面这篇文章,掌握主要流程,重点还是在调整堆这一块。
https://blog.csdn.net/u013384984/article/details/79496052
public class HeapSort {
public static void main(String[] args) {
int[] arr={4,1,3,7};
heapSort(arr);
for(int i=0;i<arr.length;i++)
System.out.println(arr[i]);
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void heapSort(int[] arr){
// 从第一个非叶节点自下往上进行调整
for(int i=arr.length/2-1;i>=0;i--)
adjustHeap(arr,i,arr.length);
// 交换堆顶元素和最后一个元素,调整堆
for(int i=arr.length-1;i>=0;i--) {
swap(arr,0,i);
adjustHeap(arr,0,i);
}
}
public static void adjustHeap(int[] arr, int i, int length){
int temp = arr[i];
for(int k=2*i+1;k<length;k=k*2+1) {
if(k+1<length && arr[k]<arr[k+1])
k++;
if(arr[k]>temp) {
arr[i] = arr[k];
i = k;
}
}
arr[i] = temp;
}
}
遍历数组,遍历到i时,a0,a1…ai-1是已经排好序的,取出ai,从ai-1开始向前和每个比较大小,如果小于,则将此位置元素向后移动,继续先前比较,如果不小于,则放到正在比较的元素之后。可见相等元素比较是,原来靠后的还是拍在后边,所以插入排序是稳定的。
package algorithm;
public class InsertSort {
public static void main(String[] args) {
int[] arr={49,38,65,97,76,13,27,49,78};
insertSort(arr);
for(int i=0;i<arr.length;i++)
System.out.println(arr[i]);
}
public static void insertSort(int[] arr) {
for(int i=1;i<arr.length;i++) {
int temp = arr[i];
int j=i-1;
while(j>=0 && arr[j]>temp) {
arr[j+1] = arr[j];
j--;
}
arr[j+1] = temp;
}
}
}
首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。
package algorithm;
public class MergeSort {
public static void main(String[] args) {
int[] arr={49,38,65,97,38};
int low = 0, high = arr.length-1;
mergeSort(arr,low,high);
for(int i=0;i<arr.length;i++)
System.out.println(arr[i]);
}
public static void mergeSort(int[] arr, int low, int high) {
if(low < high) {
int mid = (low+high)/2;
mergeSort(arr,low,mid);
mergeSort(arr,mid+1,high);
merge(arr,low,mid,high);
}
}
public static void merge(int[] arr, int low, int mid, int high) {
int[] temp = new int[high-low+1];
int k=0,i=low,j=mid+1;
while(i<=mid && j<=high) {
if(arr[i]<arr[j])
temp[k++] = arr[i++];
else
temp[k++] = arr[j++];
}
while(i<=mid)
temp[k++] = arr[i++];
while(j<=high)
temp[k++] = arr[j++];
for(k=0;k<temp.length;k++) {
arr[low+k] = temp[k];
}
}
}
package algorithm;
public class SelectSort {
public static void main(String[] args) {
int[] arr={4,1,3,7};
selectSort(arr);
for(int i=0;i<arr.length;i++)
System.out.println(arr[i]);
}
public static void selectSort(int[] arr) {
for(int i=0;i<arr.length;i++) {
int index=i;
for(int j=i+1;j<arr.length;j++)
if(arr[index]>arr[j])
index = j;
int temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
}
}
}
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
两种算法需要特殊记:
O(log2n)
,最坏情况下为O(n)
O(n)
O(1)
大部分参照上面的table即可,但是需要特别注意快排,我在四场面试问到过两次
O(nlog2n)
,但是在元素基本有序的时候反而性能最低为O(n)
计数、桶、基数
相关证明看这个文章:https://www.jianshu.com/p/15439561706d
以上,差不多可以应付面试了,如果有问题及时反馈给我哦~