排序算法汇总(软考的可以看看)
![在这里插入图片描述](https://img-blog.csdnimg.cn/83f8db03663a41aaab110464b0a3a0ae.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/3cec3778af094823af9a6377fa4d85e6.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/a7be9b1e438f40b39c8891b65f060862.png)
一、冒泡排序
1.1 算法描述
1、比较相邻的元素。如果第一个比第二个大,就交换它们两个;
2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
3、针对所有的元素重复以上的步骤,除了最后一个;
重复步骤1~3,直到排序完成。
1.2 java代码
package my.sortingAlgorithm;
import java.util.Arrays;
public class bubbleSort {
public static int[] bubbleSort(int[] array) {
if (array.length == 0)
return array;
for (int i = 0; i < array.length; i++)
for (int j = 0; j < array.length - 1 - i; j++)
if (array[j + 1] < array[j]) {
int temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
}
return array;
}
public static void main(String[] args) {
int[] arr = {2, 4, 1, 9, 19, 3, 5};
int[] ints = bubbleSort(arr);
System.out.println(Arrays.toString(ints));
}
}
1.3 动画展示
![请添加图片描述](https://img-blog.csdnimg.cn/d99eb747b00f4cde958b284ea6822f6c.gif)
二、选择排序
1.1 算法描述
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到
已排序序列的末尾。以此类推,直到所有元素均排序完毕。
1.2 java代码
package my.sortingAlgorithm;
import java.util.Arrays;
public class selectionSort {
public static int[] selectionSort(int[] array) {
if (array.length == 0)
return array;
for (int i = 0; i < array.length; i++) {
int minIndex = i;
for (int j = i; j < array.length; j++) {
if (array[j] < array[minIndex])
minIndex = j;
}
int temp = array[minIndex];
array[minIndex] = array[i];
array[i] = temp;
}
return array;
}
public static void main(String[] args) {
int[] arr = {2, 4, 1, 9, 19, 3, 5};
int[] ints = selectionSort(arr);
System.out.println(Arrays.toString(ints));
}
}
1.3 动画展示
![请添加图片描述](https://img-blog.csdnimg.cn/2a05b999b15d4e98a6b8e93035f193af.gif)
三、插入排序
1、算法描述
1、从第一个元素开始,该元素可以认为已经被排序;
2、取出下一个元素,在前面已排序的元素序列中,从后向前扫描;
3、如果该元素(已排序)大于新元素,将该元素移到下一位置;
4。重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
5、将新元素插入到该位置后;
6、重复步骤2~5。
2、java 代码
package my.sortingAlgorithm;
import java.util.Arrays;
public class InsertSort {
public static int[] InsertSort(int[] array) {
if (array == null || array.length < 2) {
return array;
}
for (int i = 0; i < array.length - 1; i++) {
int curr = array[i + 1];
int preIndex = i;
while (preIndex >= 0 && curr < array[preIndex]) {
array[preIndex + 1] = array[preIndex];
preIndex--;
}
array[preIndex + 1] = curr;
}
return array;
}
public static void main(String[] args) {
int[] arr = {2, 4, 1, 9, 19, 3, 5};
int[] ints = InsertSort(arr);
System.out.println(Arrays.toString(ints));
}
}
3、动画展示
![请添加图片描述](https://img-blog.csdnimg.cn/eba02673121f48e2a7aba7788902bd6c.gif)
四、希尔排序(插入排序优化版)
1、算法描述
1、把数组分割成若干(h)个小组(一般数组长度length/2)
2、然后对每一个小组分别进行插入排序
3、每一轮分割的数组的个数逐步缩小,h/2->h/4->h/8,并且进行排序,保证有序。
4、当h=1时,则数组排序完成。
2、java 代码
package my.sortingAlgorithm;
import java.util.Arrays;
public class ShellSort {
public static int[] ShellSort(int[] array) {
if (array == null || array.length < 2) {
return array;
}
int length = array.length;
int temp;
int gap = length / 2;
while (gap > 0) {
for (int i = gap; i < length; i++) {
temp = array[i];
int preIndex = i - gap;
while (preIndex >= 0 && array[preIndex] > temp) {
array[preIndex + gap] = array[preIndex];
preIndex -= gap;
}
array[preIndex + gap] = temp;
}
gap /= 2;
}
return array;
}
public static void main(String[] args) {
int[] arr = {2, 4, 1, 9, 19, 3, 5};
int[] ints = ShellSort(arr);
System.out.println(Arrays.toString(ints));
}
}
3、动画展示
![请添加图片描述](https://img-blog.csdnimg.cn/c349d354822743228086e745bf07a75c.gif)
五、快速排序
1、算法描述
1、从数组中选一个数做为基准值,一般选第一个数,或者最后一个数。
2、采用双指针(头尾两端)遍历,从左往右找到比基准值大的第一个数,从右往左找到比基准值小的第一个数,交换两数位置,直到头尾指针相等
或头指针大于尾指针,把基准值与头指针的数交换。这样一轮之后,左边的数就比基准值小,右边的数就比基准值大。
3、对左边的数列,重复上面1,2步骤。对右边重复1,2步骤。
4、左右两边数列递归结束后,排序完成。
2、java 代码
package my.sortingAlgorithm;
import java.util.Arrays;
public class QuickSort {
public static void quickSort(int[] array, int start, int end) {
if (start > end) {
return;
}
int i = start;
int j = end;
int key = array[start];
while (i < j) {
while (i < j && array[j] > key) {
j--;
}
while (i < j && array[i] <= key) {
i++;
}
if (i < j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
array[start] = array[i];
array[i] = key;
quickSort(array, start, i - 1);
quickSort(array, i + 1, end);
}
static int[] sort(int[] array) {
if (array == null || array.length < 2) {
return array;
}
quickSort(array, 0, array.length - 1);
return array;
}
public static void main(String[] args) {
int[] arr = {2, 4, 1, 9, 19, 3, 5};
int[] ints = sort(arr);
System.out.println(Arrays.toString(ints));
}
}
3、动画展示
![请添加图片描述](https://img-blog.csdnimg.cn/0b1b6550e53a4a5ca9f7db13e90b6e66.webp)
六、归并排序
1、算法描述
1、把数组不断划分成子序列,划成长度只有2或者1的子序列。
2、然后利用临时数组,对子序列进行排序,合并,再把临时数组的值复制回原数组。
3、反复操作1~2步骤,直到排序完成。
2、java代码
package my.sortingAlgorithm;
import java.util.Arrays;
public class MergeSort {
private static int[] mergeSort(int star, int end, int[] nums, int[] temp) {
if (nums == null || nums.length < 2) {
return nums;
}
if (star >= end) {
return nums;
}
int mid = star + (end - star) / 2;
mergeSort(star, mid, nums, temp);
mergeSort(mid + 1, end, nums, temp);
int[] merge = merge(star, end, mid, nums, temp);
return merge;
}
private static int[] merge(int star, int end, int mid, int[] nums, int[] temp) {
int index = 0;
int i = star;
int j = mid + 1;
while (i <= mid && j <= end) {
if (nums[i] > nums[j]) {
temp[index++] = nums[j++];
} else {
temp[index++] = nums[i++];
}
}
while (i <= mid) {
temp[index++] = nums[i++];
}
while (j <= end) {
temp[index++] = nums[j++];
}
if (index >= 0) System.arraycopy(temp, 0, nums, star, index);
return nums;
}
public static void main(String[] args) {
int[] arr = {2, 4, 1, 9, 19, 3, 5};
int[] ints = mergeSort(0, arr.length - 1, arr, new int[arr.length]);
System.out.println(Arrays.toString(ints));
}
}
3、动画展示
![在这里插入图片描述](https://img-blog.csdnimg.cn/e45eed19cfec4df5a061fe389a89734b.gif#pic_center)
7、堆排序
1、排序原理
1、对原数组构建成大顶堆。
2、交换头尾值,尾指针索引减一,固定最大值。
3、重新构建大顶堆。
4、重复步骤2~3,直到最后一个元素,排序完成。
2、java代码
package my.sortingAlgorithm;
import java.util.Arrays;
public class heapSort {
public static void heapify(int[] arr, int len, int i) {
int largest = i;
int lson = i * 2 + 1;
int rson = i * 2 + 2;
if (lson < len && arr[largest] < arr[lson]) {
largest = lson;
}
if (rson < len && arr[largest] < arr[rson]) {
largest = rson;
}
if (largest != i) {
swap(arr, largest, i);
heapify(arr, len, largest);
}
}
static void heap_sort(int arr[], int len) {
for (int i = len / 2 - 1; i >= 0; i--) {
heapify(arr, len, i);
}
for (int i = len - 1; i > 0; i--) {
swap(arr, i, 0);
heapify(arr, i, 0);
}
}
static void swap(int[] arr, int left, int right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
public static void main(String[] args) {
int[] arr = {2, 4, 1, 9, 19, 3, 5};
heap_sort(arr, arr.length);
System.out.println(Arrays.toString(arr));
}
}
3、动画演示
![请添加图片描述](https://img-blog.csdnimg.cn/827bc0731f12475ca4eb63ce06568d1c.gif)