前言
本篇博客集中了冒泡,選擇,二分插入,快排,歸并,堆排,六大排序算法
如果覺得對你有幫助,可以點點關注,點點贊,謝謝你!
1.冒泡排序
//冒泡排序:依次比較相鄰的兩個數,如果前一個數比后一個數大,則交換位置,將最大的數放到最后面public void bubbling(int[] arr){for(int i=0;i<arr.length;i++){//為什么要j<arr.length-i-1:每次循環將最大的數排到了最后,下次不用管它for(int j=0;j<arr.length-i-1;j++){if(arr[j]>arr[j+1]){int temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}
2.選擇排序
//選擇排序:每次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完public void selection(int[] arr){for(int i=0;i<arr.length;i++){int min=i;for(int j=i+1;j<arr.length;j++){if(arr[j]<arr[min]){min=j;}}int temp=arr[i];arr[i]=arr[min];arr[min]=temp;}}
3.插入排序
//插入排序:將一個記錄插入到已排好序的有序表中,從而得到一個新的、記錄數增1的有序表public void insertion(int[] arr){for(int i=1;i<arr.length;i++){int temp=arr[i];if(temp>=arr[i-1])continue;//二分法找到插入位置int l=0,r=i-1;while(l<=r){int mid=(l+r)/2;if(arr[mid]>temp){r=mid-1;}else{l=mid+1;}}//將插入位置之后的元素后移一位for(int j=i-1;j>=l;j--){arr[j+1]=arr[j];}arr[l]=temp;}}
4.快速排序
核心思路就是將數組的第一個值作為基準值
雙指針指向左邊界和右邊界
每次循環,將右邊界掃過的比基準值小的放到左指針位置
將左邊界掃過的比基準值大的放到右指針位置
最后找到兩個指針相等的地方,填入基準值,分成左右兩個數組進行遞歸
//快速排序:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列public void quickSort(int[] arr,int left,int right){if(left>=right)return;int l=left,r=right;//選取基準值,第一個數int temp=arr[left];while (l < r) {//從右向左找比基準值小的數,放到左邊while (l < r && arr[r] >= temp) {r--;}arr[l] = arr[r];//從左向右找比基準值大的數,放到右邊while (l < r && arr[l] <= temp) {l++;}arr[r]=arr[l];}//將基準值放到中間,分界線,左右兩邊分別遞歸arr[l]=temp;quickSort(arr,left,l-1);quickSort(arr,l+1,right);}
5.歸并排序
先分,左右兩個子組遞歸,再合
合的時候就是兩個有序組合成一個更大的有序組的過程
//歸并排序:將兩個(或兩個以上)有序表合并成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然后再把有序子序列合并為整體有序序列public void mergeSort(int[] arr,int left,int right){//先分if(left>=right)return;int mid=(left+right)/2;mergeSort(arr,left,mid);mergeSort(arr,mid+1,right);//再合int[] temp=new int[right-left+1];int i=left,j=mid+1,k=0;while(i<=mid&&j<=right){if(arr[i]<=arr[j]){temp[k++]=arr[i++];}else{temp[k++]=arr[j++];}}while(i<=mid){temp[k++]=arr[i++];}while(j<=right){temp[k++]=arr[j++];}for(int m=0;m<temp.length;m++){arr[left+m]=temp[m];}}
6.堆排序
最大堆:根節點大于左右節點
最小堆:根節點小于左右節點
我的另一篇博客:
?數組中的第K個最大元素:堆排序-CSDN博客
//堆排序:堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序算法。堆積是一個近似完全二叉樹的結構,并同時滿足堆積的性質:即子結點的鍵值或索引總是小于(或者大于)它的父節點public void heapSort(int[] arr){int len=arr.length;//建堆for(int i=len/2-1;i>=0;i--){adjustHeap(arr,i,len);}}private void adjustHeap(int[] arr,int i,int len) {int index=i;int l=i*2+1,r=i*2+2;if(l<len&&arr[l]>arr[index])index=l;if(r<len&&arr[r]>arr[index])index=r;if(index!=i){int temp=arr[i];arr[i]=arr[index];arr[index]=temp;adjustHeap(arr,index,len);}}