数据结构之基本排序

#include <stdio.h>
void SelectSort(int r[],int n);//选择排序
void BubbleSort();//冒泡排序
void MergeSort();//归并排序
void QuickSort();//快速排序
void Merge();//(归并里合并)子序列
void Insert();//插入排序
void HeapSort();//堆排序


int Partition();

int main(){
    int r[6];
    int i;
    printf("请输入:");
    for(i=0;i<6;i++){
            scanf("%d",&r[i]);
        }
    for(i=0;i<6;i++){
            printf("%d ",r[i]);
        }
    printf("\n");
    printf("\n");
    //SelectSort(r,6);
    //BubbleSort(r,6);
    //MergeSort(r,0,5);
    //Insert(r,6);
    //QuickSort(r,0,5);
    HeapSort(r,6);
    for(i=0;i<6;i++){
            printf("%d ",r[i]);
        }
    printf("\n");
    return 0;
}

void SelectSort(int r[],int n){
    int i,j,index,temp;
    for(i=0;i<n-1;i++){//进行n-1次换位
        index=i;
        for(j=i+1;j<n;j++){
            if(r[j]<r[index]) index=j;
        }
        if(index!=i)  {temp=r[i];r[i]=r[index];r[index]=temp;}
        
    }
    
}

void BubbleSort(int r[],int n){//
    int j,bound,exchange=n-1;//第一趟起泡排序区间【0,n-1】
    while(exchange!=0){//当上一趟排序有记录交换时
        bound=exchange;exchange=0;

        for(j=0;j<bound;j++){
            if(r[j]>r[j+1]){
                int temp=r[j];r[j]=r[j+1];r[j+1]=temp;//交换
                exchange=j;//记录每一次交换的位置
            }

        }
    }

}

void Merge(int r[],int r1[],int s,int m,int t){//合并子序列
    int i=s,j=m+1;
    //int flag=0;
    int flag=s;
    //for(i=s;i<=m;i++){
    //for(j=m+1;j<=t;j++){
    while(i<=m&&j<=t){
            if(r[i]<=r[j])  {r1[flag++]=r[i];i++;}
            else {r1[flag++]=r[j]; j++;}
    }
    while(i<=m){//若第一个子序没处理完,则进行收尾
        r1[flag++]=r[i++];
    }
    while(j<=t){//若第二个子序没处理完,则进行收尾
        r1[flag++]=r[j++];
    }
    }


void MergeSort(int r[],int s,int t){//对序列r[s]~r[t]进行归并排序
    int m;
    int i;
    int r1[1000];
    if(s==t) return;//只有一个记录
    else{
        m=(s+t)/2;  //划分
        MergeSort(r,s,m);//求解子问题1,归并排序前半部分(分治法)
        MergeSort(r,m+1,t);//求解子问题2,归并排序后半部分
        Merge(r,r1,s,m,t);
        for(i=s;i<=t;i++){
            r[i]=r1[i];//将有序序列传回数组r中
        }
    
    }
}

int Partition(int r[],int first,int end){
    int i=first,j=end;
    while(i<j){
        while(i<j&&r[i]<=r[j]) j--;//右侧扫描
        if(i<j){
            int temp=r[i];r[i]=r[j];r[j]=temp;//交换
            i++;
        }
        while(i<j&&r[i]<=r[j]) i++;//左侧扫描
        if(i<j){
            int temp=r[i];r[i]=r[j];r[j]=temp;//交换
            i--;
        }
    }
    return i;
}

扫描二维码关注公众号,回复: 5479249 查看本文章


void QuickSort(int r[],int first,int end){
    int pivot;
    if(first<end){
        pivot=Partition(r,first,end);//划分  pivot轴值
        QuickSort(r,first,pivot-1);//求解子问题1,对左侧子序列进行快排
        QuickSort(r,pivot+1,end);//求解子问题2,对右侧子序列进行快排
    }

}

void Insert(int r[],int n){//n个元素,放r[1~n]//将待排序的记录插入到已经已排好序的序列中
    int i,j;
    for(i=2;i<=n;i++){//待排记录序列于r[1~n]
        r[0]=r[i];//暂存待插记录,设置哨兵
        
        for(j=i-1;r[0]<r[j];j--){//从后往前找待插记录!!!!!!!!!!!!!!!!!!!!!!
            r[j+1]=r[j];//比r[0]小大,后移
        }
        r[j+1]=r[0];
    }
    
}

void SiftHeap(int r[],int k,int n){//调整堆
    int i,j,temp;
    i=k;j=2*i+1;//置i为要筛的结点,j为i的做孩子
    while(j<n){//筛选还没进行到叶子
        if(j<n-1&&r[j]<r[j+1]) j++;//比较i的左右孩子,j为较大者
        if(r[i]>r[j]) break;//根节点已经大于左右孩子中的较大者
        else {
            temp=r[i];r[i]=r[j];r[j]=temp;//将被筛结点与结点j交换
            i=j;j=2*i+1;//被筛结点位于原来结点j的位置
        }
    }
}

void HeapSort(int r[],int n){
    int i,temp;
    for(i=(n-1)/2;i>=0;i--)//初始建堆,最后一个分支的下标是(n-1)/2;
        SiftHeap(r,i,n);
    for(i=1;i<=n-1;i++){//重复执行移走堆顶及重建堆的操作
        temp=r[0];r[0]=r[n-i];r[n-i]=temp;
        SiftHeap(r,0,n-i);//只需调整根节点
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39063044/article/details/88353943