排序是重要的算法,熟练地掌握各种排序算法是程序员必备的素质。博主学习排序的时候经常去翻阅他人博客,收获很大,总结出了各种排序,现在分享出来。所有算法都是经过博主检验的,应该没啥大问题。
冒泡排序:
public static void bubbleSort(int a[]){
int temp, flag;
for(int i=0;i<a.length;i++){
flag=0;
for(int j=0;j<a.length-1;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag++;
}
}
if(flag==0)
break;
}
}
选择排序:
public static void selectSort(int[] a){
int index,temp;;
for(int i=a.length-1;i>=0;i--){
index=0;
for(int j=1;j<=i;j++){
if(a[j]>a[index]){
index=j;
}
}
temp=a[i];
a[i]=a[index];
a[index]=temp;
}
}
插入排序:
public static void insertSort(int[] a){
int temp=0,j=0;
for(int i=1;i<a.length;i++){
temp=a[i];
for(j=i-1;j>=0&&temp<=a[j];j--)
a[j+1]=a[j];
a[j+1]=temp;
}
}
希尔排序:
public static void shellSort(int[] a){
int d=a.length;
int temp=0;
while(d!=0){
d=d/2;
for(int x=0;x<d;x++){
for(int i=x+d;i<a.length;i+=d){
temp=a[i];
int j=0;
for(j=i-d;j>=0&&temp<=a[j];j-=d)
a[j+d]=a[j];
a[j+d]=temp;
}
}
}
}
快速排序:
public static void quick_sort(int a[], int l, int r)
{
if (l < r)
{
int i = l, j = r, x = a[l];
while (i < j)
{
while(i < j && a[j] >= x) // 从右向左找第一个小于x的数
j--;
if(i < j)
a[i++] = a[j];
while(i < j && a[i] < x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
a[j--] = a[i];
}
a[i] = x;
quick_sort(a, l, i - 1); // 递归调用
quick_sort(a, i + 1, r);
}
}
归并排序:
public static void mergeArray(int[] a,int first,int mid,int last,int[] c){
int i=first;
int m=mid;
int j=mid+1;
int n=last;
int k=0;
while(i<=m&&j<=n){
if(a[i]<=a[j])
c[k++]=a[i++];
else
c[k++]=a[j++];
}
while(i<=m)
c[k++]=a[i++];
while(j<=n)
c[k++]=a[j++];
for(i=0;i<k;i++){
a[first+i]=c[i];
}
}
public static void mergeSortFunction(int[] a,int first,int last,int[] temp){
int mid=first+(last-first)/2;
if(first<last){
mergeSortFunction(a,first,mid,temp);
mergeSortFunction(a,mid+1,last,temp);
mergeArray(a,first,mid,last,temp);
}
}
堆排序:
public static void heapify(int[] a,int i,int j){
int k=2*i;//k 是i的左孩子
int x=a[i];//用x来保存a[i] 便于空出根位置 让大儿子上升
while(k<=j){//循环判断 条件 也就是i不是叶子
if(k<j)//因为要有左右孩子 所以k<j
if(a[k]<a[k+1]) k=k+1;//if判断左右孩子谁更大 如果右边大 让k指向右边 因此k一直指向最大的那个孩子 也就是大儿子
if(x>=a[k]) //如果根元素已经大于等于大儿子了 这时候堆调整结束 循环终止
break;
else{
a[i]=a[k];//否则的话 让大儿子占据根元素 位置上升
i=k;// 这时候 原来的根元素指向之前大儿子的位置
k=2*i;//再次让k成为i的左孩子 进行下一次 堆调整
}
}
a[i]=x;//最后将最原始的根元素放入底部
}
public static void heapSort(int[] a,int n){
for(int i=n/2;i>=1;i--)//考虑到左右孩子的值,i不能超过一半 也不能为0 循环调整堆 即初始化堆
heapify(a,i,n);
for(int i=n;i>1;i--){//循环将根元素和最后一片叶子交换
int temp=a[1];
a[1]=a[i];
a[i]=temp;
heapify(a,1,i-1);//重新初始化堆 从1到i-1
}
}