排序算法

堆排序

#include<stdio.h>

const int NN=100010;
int heap[NN],n;

void adjust_heap(int low,int high){
    int i=low,j=i*2;
    while(j<=high){
        if(j+1<=high&&heap[j+1]>heap[j]) j=j+1;
        if(heap[j]>heap[i]){
            int t=heap[i];heap[i]=heap[j];heap[j]=t;
            i=j;
            j=j*2;
        }
        else break;
    }
}

void create_heap(){
    for(int i=n/2;i>=1;i--){
        adjust_heap(i,n);
    }
}

void swap_heap(int last){
    int t=heap[1];
    heap[1]=heap[last];
    heap[last]=t;
    adjust_heap(1,last-1);
}

void heap_sort(){
    create_heap();
    printf("初始大根堆:\n");
    for(int i=1;i<=n;i++) printf("%d ",heap[i]);
    printf("\n每趟调整后的序列:\n");
    for(int i=n;i>1;i--){
        swap_heap(i);
        for(int i=1;i<=n;i++) printf("%d ",heap[i]);
        printf("\n");
    }
    printf("最后的有序序列:\n");    
    for(int i=1;i<=n;i++) printf("%d ",heap[i]);
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&heap[i]);
    heap_sort();
}

快速排序

#include<stdio.h>

const int NN=100010;
int a[NN],n;

int partition(int left,int right){
    int flag=a[left];
    while(left<right){
        while(left<right&&a[right]>flag) right--;
        a[left]=a[right];
        while(left<right&&a[left]<=flag) left++;
        a[right]=a[left];
    }
    a[left]=flag;
    for(int i=1;i<=n;i++) printf("%d ",a[i]);
    printf("\n");
    return left;
}

void quick_sort(int left,int right){
    if(left<right){
        int op=partition(left,right);
        quick_sort(left,op-1);
        quick_sort(op+1,right);
    }
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    printf("每趟排序后结果:\n");
    quick_sort(1,n);
    printf("最终结果:\n");
    for(int i=1;i<=n;i++) printf("%d ",a[i]);
}

希尔排序

#include<stdio.h>

const int NN=100010;
int a[NN],d[NN],n,t;

void shell_insert(int d){
    int i,j;
    for(i=1+d;i<=n;i++){
        if(a[i-d]>a[i]){
            int temp=a[i];
            for(j=i-d;j>0&&temp<a[j];j-=d){
                a[j+d]=a[j];
            }
            a[j+d]=temp;
        }
    }
    for(int i=1;i<=n;i++) printf("%d ",a[i]);
    printf("\n");
}

void shell_sort(){
    for(int i=0;i<t;i++){
        shell_insert(d[i]);
    }
}

int main(){
    printf("请输入关键字数量:\n");
    scanf("%d",&n);
    printf("请输入关键字序列:\n");
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    printf("请输入所选取增量的数量:\n");
    scanf("%d",&t);
    printf("请输入选取的增量:\n");
    for(int i=0;i<t;i++) scanf("%d",&d[i]);
    printf("每趟排序后结果:\n");
    shell_sort();
    printf("最终结果:\n");
    for(int i=1;i<=n;i++) printf("%d ",a[i]);
}