6-sorting

Part A-search image1

Part B-sorting Comparison based sort image2

1,Bubble Sort 思路

![image3](../../assets/fdd03ec538d94296b3946cd264c5b4dc.png)

![image4](../../assets/ae6215000f3048ae9291c4fa96ddbae0.png)

image5

代码

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;

}

}

}

}

2,selection sort 一直把最小的放在前面

![image6](../../assets/e90d833166c34f45a1e5e0d8df7748e1.png)

![image7](../../assets/49f2093998954ab0ab1a7c1070422808.png)

image8

3,insertion sort image9

![image10](../../assets/54856f6dea48440fb679165fe1e06ef6.png)

![image11](../../assets/de8af8b29e7a409e97bca1b59b4eb03a.png)

public static void InsertSort(int arr[1]) {

int insertVal=0;

int insertIndex=0;

for(int i=1;i<arr.length;i++) {

//定义待插入的数

insertVal=arr[i];

insertIndex=i-1;//前一个数的下标

// 给 insertVal 找到插入的位置

// 说明

//1.insertIndex>=0 保证在给 insertVal 找插入位置,不越界

//2.insertVal<arr[insertIndex] 待插入的数,还没有找到插入位置

//3. 就需要将 arr[insertIndex] 后移

while(insertIndex>=0&&insertVal<arr[insertIndex]) {

arr[insertIndex+1]=arr[insertIndex];

insertIndex--;

}

// 当退出 while 循环时,说明插入的位置找到,insertIndex+1

//这里我们判断是否需要赋值

if(insertIndex+1!=i) {

arr[insertIndex+1]=insertVal;

}

}

4,Quick sort

![image12](../../assets/549964efcfb54d978e3af5d0f2266544.png)

public static void QuickSortDemo(int []arr,int left,int right) {

int l=left;//左下标

int r=right;//右下标

int temp=0;

int pivot=arr[(left+right)/2];//选取它,其他数和它比较分类

//while 循环的目的是让比 pivot 值小放到左边 ,比 pivot 值大放到右边

while(l<r) {

//在 pivot 的左边一直找,找到大于等于 pivot 值,才退出

while(arr[l]<pivot) {

l+=1;

}

//在 pivot 的右边一直找,找到大于等于 pivot 值,才退出

while(arr[r]>pivot) {

r-=1;

}

//如果 l>=r 说明 pivot 的左右两的值,已经按照左边全部是

//小于等于 pivot 值,右边全部是大于等于 pivot 值

if(l>=r) {

break;

}

//交换

temp=arr[l];

arr[l]=arr[r];

arr[r]=temp;

//如果交换完后,发现这个 arr[l]==pivot 值 相等 r--, 前移

//可以理解为:指定的pivot,里面有一个数和它相等,假如左边卡住,无法移动,右边退一步来推动查询

if(arr[l]==pivot) {

r-=1;

}

//如果交换完后,发现这个 arr[r]==pivot 值 相等 l++, 后移

if(arr[r]==pivot) {

l+=1;

}

}

// 如果 l==r, 必须 l++,r--, 否则为出现栈溢出

if(l==r) {

l+=1;

r-=1;

}

if(left<r) {

QuickSortDemo(arr,left,r);

}

if(right>l) {

QuickSortDemo(arr, l, right);

}

}

5,Merge sort[no code] Divide and Conquer Approach image13

image14 image15

Stable/unstable A stable sorting algorithm is any sorting algorithm that preserves the relative ordering of items with equal values.
In-place / Out-place an in-place algorithm is an algorithm which transforms input using no auxiliary data structure.
image16

image17

总结

![image18](../../assets/cabf1ea219e1441bb55046edfa16aa5a.png)

![image19](../../assets/0330d07905214a1a852bf67a1ad5f3a3.png)

Non-comparison 1,counting sort(类似桶排序)

![image20](../../assets/024aedb9f92c45c99843142adbe9f43b.png)

![image21](../../assets/d93035963c974950b87a218a58011e7c.png)

2,bucket sort【stable】

![image22](../../assets/3ebb2436b1ab43a9b4d9d2f930624308.png)

![image23](../../assets/26cbdf9aa9da4fad81056b4ba88e9b91.png)

3,Radix Sort【从右到左】

![image24](../../assets/fb1ae3638af440afbe0bf7ebbeaea7a6.png)