排序算法java代码 冒泡排序、快速排序、插入排序、希尔排序、选择排序、堆排序、归并排序
时间复杂度:O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(nk)<O(2n)
8大排序算法:
1.冒泡排序 (交换排序) O(n2)
2.快速排序 (交换排序) O(n2)
3.直接插入排序(插入排序) O(n2)
4.希尔排序 (插入排序)
5.简单选择排序(选择排序) O(n2)
6.堆排序 (选择排序)O(nlogn)
7.归并排序 O(nlogn)
8.基数排序
1.冒泡排序
思路:两两比较,找到最大的,再找到次大的……
【例子】:{5,7,2,9,4,1,0,5,7}
5,2,7,4,1,0,5,7,9
2,5,4,1,0,5,7,7,9
2,4,1,0,5,5,7,7,9
2,1,0,4,5,5,7,7,9
1,0,2,4,5,5,7,7,9
0,1,2,4,5,5,7,7,9
0,1,2,4,5,5,7,7,9
0,1,2,4,5,5,7,7,9
public void bubbleSort(int[]arr){ //循环arr.length-1次 for(int i=0;i<arr.length-1;i++){ for(int j=0;j<arr.length-i-1;j++){ //两两交换,大的放到后面 if(arr[j+1]<arr[j]){ int tmp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=tmp; } } } }
2.快速排序
思路:把数组第一个作为标准,大的放在标准的左边,小的放在标准的右边
【例子】:{5,7,2,9,4,1,0,5,7}
第一次排序后:{2,1,3}{8,9,5,7,5,6}
public void quickSort(int[]arr,int start,int end){ if(start>=end) return; //选取标准 int stard=arr[start]; int low=start; int high=end; while(low<high){ //大的话就左移 while(low<high&&stard<=arr[high]) high--; arr[low]=arr[high]; //小的话就右移 while(low<high&&arr[low]<=stard) low++; arr[high]=arr[low]; } arr[high]=stard; quickSort(arr, start, low); quickSort(arr, high+1, end); }
3.插入排序
思路:认为前面都是有序的,一个个往前插入
【例子】:{5,7,2,9,4,1,0,5,7}
{5,7,2,9,4,1,0,5,7}
{2,5,7,9,4,1,0,5,7}
{2,5,7,9,4,1,0,5,7}
{2,4,5,7,9,1,0,5,7}
{1,2,4,5,7,9,0,5,7}
{0,1,2,4,5,7,9,5,7}
{0,1,2,4,5,5,7,9,7}
{0,1,2,4,5,5,7,7,9}
public void insertSort(int[]arr){ for(int i=1;i<arr.length;i++){ if(arr[i]<arr[i-1]){ int tmp=arr[i]; //找到前面合适的位置,插入 int j; for(j=i-1;j>=0&&tmp<arr[j];j--){ arr[j+1]=arr[j];//往后挪 } arr[j+1]=tmp; } } }
4.希尔排序
思路:分组插入排序
【例子】:{5,7,2,9,4,1,0,5,7}
d=4 {4,7,2,9,5,1,0,5,7}
d=4 {4,1,2,9,5,7,0,5,7}
d=4 {4,1,0,9,5,7,2,5,7}
d=4 {4,1,0,5,5,7,2,9,7}
d=4 {4,1,0,5,5,7,2,9,7}
d=2 {0,1,4,5,5,7,2,9,7}
d=2 {0,1,4,5,5,7,2,9,7}
d=2 {0,1,4,5,5,7,2,9,7}
d=2 {0,1,4,5,5,7,2,9,7}
d=2 {0,1,2,5,4,7,5,9,7}
d=2 {0,1,2,5,4,7,5,9,7}
d=2 {0,1,2,5,4,7,5,9,7}
d=1 {0,1,2,5,4,7,5,9,7}
…
public void sheelSort(int[]arr){ //遍历所有步长 for(int d=arr.length/2;d>0;d=d/2){ //遍历所有元素 for(int i=d;i<arr.length;i++){ //插入排序 for(int j=i-d;j>=0;j=j-d){ //交换 if(arr[j+d]<arr[j]){ int tmp=arr[j]; arr[j]=arr[j+d]; arr[j+d]=tmp; } } } } }
5.选择排序
思路:当前遍历数和后面所有的数比较,记录最小的下标,交换
【例子】:{5,7,2,9,4,1,0,5,7}
{0,7,2,9,4,1,5,5,7}
{0,1,2,9,4,7,5,5,7}
{0,1,2,9,4,7,5,5,7}
{0,1,2,4,9,7,5,5,7}
{0,1,2,4,5,7,9,5,7}
{0,1,2,4,5,5,9,7,7}
{0,1,2,4,5,5,7,9,7}
{0,1,2,4,5,5,7,7,9}
{0,1,2,4,5,5,7,7,9}
public void selectSort(int[]arr){ for (int i = 0; i < arr.length; i++) { int minIndex=i; for (int j = i+1; j < arr.length; j++) { if(arr[j]<arr[minIndex]){ minIndex=j; } } //交换 if(i!=minIndex) { int tmp=arr[i]; arr[i]=arr[minIndex]; arr[minIndex]=tmp; } } }
6.堆排序
思路:二叉树
基础知识:
最大堆:越上层,数越大。root数最大
最小堆:越上层,数越小。root数最小
升序排列:最大堆
降序排列:最小堆
顺序存储的二叉树(考虑完全二叉树):用数组存
第n个元素的左子节点:2n+1
第n个元素的右子节点:2n+2
第n个元素的父节点:(n-1)/2
public void heapSort(int[] arr) { //开始位置是最后一个非叶子节点,最后一个节点的父节点 //调整整个结构为最大堆/大顶堆 for (int i = (arr.length-1)/2; 0<=i; i--) { maxHeap(arr, arr.length, i); } //最大的放到后面,第0和第n换位置,再调整成大顶堆 for(int i=arr.length-1;0<i;i--){ int tmp=arr[0]; arr[0]=arr[i]; arr[i]=tmp; maxHeap(arr, i, 0); } } public void maxHeap(int[] arr,int size,int index){ //左右节点 int leftNode=2*index+1; int rightNode=2*index+2; int max=index; //找出最大的节点 if(leftNode<size&&arr[max]<arr[leftNode]) max=leftNode; if(rightNode<size&&arr[max]<arr[rightNode]) max=rightNode; //交换位置 if(max!=index){ int tmp=arr[max]; arr[max]=arr[index]; arr[index]=tmp; //交换后可能会破坏之前排好的堆,重新调整 maxHeap(arr, size, max); } }
7.归并排序
思路:二路归并,先拆分成一个个的元素,再合并排序
public void mergeSort(int[]arr,int start,int end){ if(end<start) return ; int mid=(start+end)/2; mergeSort(arr, start, mid); mergeSort(arr, mid+1, end); merge(arr, start,mid, end); } private void merge(int[] arr, int start, int mid, int end) { //合并两个排好序的数组 //临时数组,存放排好序的最终结果 int[]tmp =new int[end-start+1]; int i=start; int j=mid+1; //tmp的指针 int index=0; while(i<=start&&j<=end){ //谁小谁放入tmp里 if(arr[i]<=arr[j]){ //放入tmp里 tmp[index]=arr[i]; index++; i++; }else{ tmp[index]=arr[j]; index++; j++; } } //剩余的也放入tmp while(i<=mid) tmp[index++]=arr[i++]; while(j<=end) tmp[index++]=arr[j++]; //tmp放入arr for(i=start;i<=end;i++){ arr[i]=tmp[i-start]; } }
8.基数排序
思路:假设有10个桶,每次按照个位、十位、百位 数字放入到十个桶中。
- 点赞
- 收藏
- 分享
- 文章举报
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 常用的排序算法(快速排序、插入排序、希尔排序、堆排序、冒泡排序、选择排序、归并排序)
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- 各种排序算法总结----基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 各种排序算法实现——基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
- 【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序
- JAVA实现选 4000 择排序、冒泡排序、插入排序、归并排序、希尔排序、堆排序和快速排序
- 直通BAT-排序1(冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序)
- 冒泡排序,插入排序,快速排序,归并排序,堆排序,选择排序,希尔排序
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
- C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——JAVA实现
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
- 排序算法(冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序)
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——C++实现