冒泡排序
- 算法复杂度 :O(n)
- 实现代码
public static void BubbleSort(int []arr){int temp;for(int i=0;i<arr.length-1;i++){for(int j=arr.length-1;j>i;j--){if(arr[j]<arr[j-1]){temp=arr[j];arr[j]=arr[j-1];arr[j-1]=temp;}}}}
选择排序
基本思想:
在长度为N的数组中,第一次遍历n-1个数,找到最小的数1与第一个交换 第二次遍历n-2个数,找到最小的数与第二个元素交换 。。。 第n-1次遍历,找到最小的数与第n-1个元素交换,排序完成。
平均时间复杂度:O(n)
java代码
public static void SelectSort(int arr[]){for(int i=0;i<arr.length-1;i++){int minIndex=i;}for(int j=i+1;j<arr.length;j++){if(arr[j]<arr[minIndex]) minIndex=j;if(minIndex!=i){int temp=arr[i];arr[i]=arr[minIndex];arr[minIndex]=temp;}}}
插入排序
基本思想
在要排序的一组数中,假定前n-1个数已经排序好,现将第n个数岔道前面的有序数列的恰当位置中。
平均时间复杂度:O(n)
java代码
public static void insertSort(int arr[]){int temp;for(int i=0;i<arr.length-1;i++){for(int j=i+1;j>0;j--){if(arr[j]<arr[j-1]){temp=arr[j-1];arr[j-1]=arr[j];arr[j]=temp;}else{break;}}}}
快速排序
基本思想:分治
- 先从数列中取出一个数作为key值
- 将比这个数小的数全部放在它左边,大于等于它的数放在右边
- 对左右区间重复上一步,直至各个区间只有一个数
java代码
public static void quickSort(int a[],int l,int r){if(l>=r)return;int i=l;int j=r;int key=a[l];while(i<j){while(i<j&&a[j]>=key)j--;if(i<j){a[i]=a[j];i++;}while(i<j&&a[i]<key)i++;if(i<j){a[j]=a[i];j--;}}a[i]=key;quickSort(a,l,i-1);quickSort(a,i+1,r);}
希尔排序
基本思想:
在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。然后逐渐减小增量。 重入上述步骤,直至增量为1,此时数据基本有序,最后进行插入排序。
java代码
public static void shellSort(int arr[]){int temp=0;int incre=arr.length;while(true){incre=incre/2;for(int k=0;k<incre;k++){for(int i=k+incre;i<arr.length;i+=incre){for(int j=i;>k;j-=incre){if(arr[j]<arr[j-incre]){temp=arr[j-incre];arr[j-incre]=arr[j];arr[j]=temp;}else{break;}}}}if(incre==1){break;}}}
归并排序
平均时间复杂度:O(NlogN)
java代码
public static void mergeSort(int a[],int first,int last,int temp[]){if(first<last){int middle=(firstt+last)/2;mergeSort(a,first,middle,temp);mergeSort(a,middle+1,last,temp);mergeArray(a,first,middle,last,temp);}}public static void mergeArray(int a[],int firstt,int middle,int end,int temp[]){int i=first;int m=middle;int j=middle+1;int n=end;int k=0;while(i<=m&&j<=n){if(a[i]<=a[j]){temp[k]=a[i];k++;i++;}else{temp[k]=a[j];k++;j++;}}while(i<=m){temp[k]=a[i];k++;i++;}while(j<=n){temp[k]=a[j];k++;j++;}for(int _i=0;_i<k;_i++){a[first+_i]=temp[_i];}}
堆排序
平均时间复杂度:O(NlogN)
java代码 ```java public static void makeMinHeap(int a[],int n){ for(int i=(n-1)/2;i>=0;i—){
minHeapFixDown(a,i,n);
} } public static void minHeapFixDown(int a[],int i,int n){ int j=2*i+1; int temp=0; while(j<n){
if(j+1<n&&a[j+1]<a[j]) j++; if(a[i]<=a[j]) break; temp=a[i]; a[i]=a[j]; a[j]=temp; i=j; j=2*i+1;} }
public static void minHeapSort(int a[],int n){ int temp=0; makeMinHeap(a,n); for(int i=n-1;i>0;i—){ temp=a[0]; a[0]=a[i]; a[i]=temp; minHeapFixDown(a,0,i); } }
<a name="JkSXS"></a>
# 基数排序
- 在长度为10的数组中,首先根据个位数分类,放在十个表头中,再根据十位数,大小插入到链表中适当位置
- java代码
```java
public static void radixSort(int a[],int temp[],int n,int k,int r,int cnt[]){
//n:序列的数字个数
//k:最大的位数2
//r:基数10
//cnt:存储bin[i]的个数
for(int i=0;rtok=1;i<k;i++,rtok=rtok*r){
for(int j=0;j<r;j++){
cnt[j]=0;
}
for(int j=0;j<n;j++){
cnt[(a[j]/rtok)%r]++;
}
for(int j=n-1;j>=0;j--){
cnt[(a[j]/rtok)%r]--;
temp[cnt[(a[j]/rtok)%r]]=a[j];
}
for(int j=0;j<n;j++){
a[j]=temp[j];
}
}
}
