一、排序的概念
二、排序的常见算法
2.1 插入排序
public static void insertSort(int[] array){
for(int i=1;i<array.length-1;i++){
int tmp=array[i];
int j=i-1;
for(j=i-1;j>=0;j--){
if(tmp<array[j]){
array[j+1]=array[j];
}else{
break;
}
}
array[j]=tmp;//无论是中途跳出还是最终结束,都要执行这一个步骤
}
}
2.2 希尔排序
//2 希尔排序
public static void shellSort(int[] array){
int gap=array.length;
while(gap!=1){
gap=gap/2;
shell(array,gap);
}
shell(array,1);
}
private static void shell(int[] array,int gap){
for(int i=gap;i<array.length-1;i++){
int tmp=array[i];
int j=i-gap;
for(j=i-gap;j>=0;j=j-gap){//递减的数字
if(tmp<array[j]){
array[j+gap]=array[j];
}else{
break;
}
}
array[j]=tmp;//这里是j把
}
}
2.3 选择排序
//3 选择排序:只找最小元素
public static void selectSort1(int[] array){
for(int i=0;i<array.length-1;i++){
int min=array[i];
int j=i+1;
for(j=i+1;j<array.length-1;j++){
if(array[j]<min){
int tmp=array[j];
array[tmp]=array[j];
array[j]=tmp;
}
}
}
}
2.4 堆排序
//5 堆排序:建立大根堆、交换、向下调整
public static void heapSort(int[] array){
createHeap(array);
int end=array.length-1;
while(end>0){
swap(array,0,end);
turnDown(array,0,end);
end--;
}
}
public static void createHeap(int[] array){
for(int parent=(array.length-1-1)/2;parent>=0;parent--){
int len=array.length;
turnDown(array,parent,len);
}
}
public static void turnDown(int[] array,int parent,int len){
int child=2*parent+1;
while(child<len){
if(child+1<len && array[child+1]>array[child]){
child=child+1;
}
if(array[child]>array[parent]){
swap(array,child,parent);
parent=child;
child=2*parent+1;
}else{
break;
}
}
}
2.5 冒泡排序
//6 冒泡排序
public static void bubbleSort(int[] array){
for(int i=0;i<array.length-1;i++){
boolean flg=true;
for(int j=0;j<array.length-1-i;j++){
if(array[j]>array[j+1]){
swap(array,i,j+1);
flg=false;
}
}
if(flg==true){
break;
}
}
}
2.6 快速排序
//7 快速排序hoare版
public static void quickSort(int[] array){
quick(array,0,array.length-1);
}
public static void quick(int[] array,int left,int right){
if(left>=right){
return;
}
int pilot=partition(array,left,right);
quick(array,left,pilot-1);
quick(array,pilot+1,right);
}
public static int partition(int[] array,int start,int end){
int i=start;
int key=array[start];
while(start<end){
while(start<end && array[end]>=key){
end--;
}
while(start<end && array[start]<=key){
start++;
}
swap(array,start,end);
}
swap(array,i,start);
return start;
}
2.7 归并排序
//11 归并排序
public static void mergeSort(int[] array,int left,int right){
int mid=(left+right)/2;
mergeSort(array,left,mid);
mergeSort(array,mid+1,right);//利用递归不断的分解
merge(array,left,right,mid);
}
private static void merge(int[] array,int start,int end,int midIndex){
int[] tmpArr=new int[end-start+1];
int k=0;
int s1=start;
int s2=midIndex+1;
//当合并的两个有序数组内部都是有元素的时候
while(s1<=midIndex && s2<=end){
if(array[s1]<array[s2]){
tmpArr[k++]=array[s1++];
}else{
tmpArr[k++]=array[s2++];
}
}
//判断跳出循环,是因为哪个数组走完了
while(s1<=midIndex){
tmpArr[k++]=array[s1++];
}
while(s2<=end){
tmpArr[k++]=array[s2++];
}
//把排序好的数字拷贝回原数组
for(int i=0;i<k;i++){
array[i+start]=tmpArr[i];
}
}
2.8 计数排序
//13 计数排序:统计数组里面相同元素的出现次数
//比如:统计【101-120】之间的数字出现的次数
public static void countSort(int[] array){
int minVal=array[0];
int maxVal=array[0];
for(int i=0;i<array.length;i++){
if(array[i]<minVal){
minVal=array[i];
}
if(array[i]>maxVal){
maxVal=array[i];
}
}
int[] count=new int[maxVal-minVal+1];
for(int i=0;i<array.length;i++){
count[array[i]-minVal]++;
}
int index=0;
for(int i=0;i<count.length-1;i++){
while(count[i]!=0){
array[index++]=i+minVal;//实际上用元素大小表示下标,元素太大的话就减去最小值
count[i]--;
}
}
}