常见经典排序算法:插入排序、希尔排序、选择排序、冒泡排序、快速排序

#include<stdio.h>


void Output(int Array[],int n){
    int i;
    for(i=0;i<n-1;i++){
        printf("%d ",Array[i]);
    }
    printf("%d",Array[n-1]);
}
//插入排序
void InsertSort(int Array[],int n){
    int i,temp;
    for(i=0;i<n-1;i++){
        //i位置以前的元素表示已经排好序的
        //temp记录已经排好序列的下一个元素(需要插入到排好序列中的元素)
        temp=Array[i+1];
        while(i>=0){
            if(temp<Array[i]){
                //如果需要插入有序序列中的元素小于当前比较的元素则,把当前比较的元素往后移,然后让temp继续与前面的元素比较
                Array[i+1]=Array[i];
                i--;
            }else{
                break;
            }
        }
        //如果与已经排好序的所有元素都比较完了还没有比其更小的元素就把temp放到第1个位置
        //如果比较到一个比其更小的元素就把temp放在比之更小的元素后面
        Array[i+1]=temp;
    }
    Output(Array,n);
}

//希尔排序
void ShellSort(int Array[],int n){
    int i,temp;
    int step;
    //step为排序的间距
    step=n;
    while(step>1){
        //每次间距折半,直到间距为1
        step=step/2;
        //以下按照间距为一组的插入排序
        for(i=0;i<n-step;i++){
            temp=Array[i+step];
            while(i>=0){
                if(temp<Array[i]){
                    Array[i+step]=Array[i];
                    i=i-step;
                }else{
                    break;
                }
            }
            Array[i+step]=temp;
        }
    }
    Output(Array,n);
}

//选择排序
void SelectSort(int Array[],int n){
    int i,j,index,min;
    for(i=0;i<n-1;i++){
        //把还没有排序序列的第一个元素记为最小元素
        min=Array[i];
        //index记录还未排序数组中最小元素的下标
        index=-1;
        for(j=i+1;j<n;j++){
            if(Array[j]<min){
                //遇到比之前记录的最小值更小的元素则将其赋值给min并记录下标index
                min=Array[j];
                index=j;
            }
        }
        //index的值改变了就说明未排序数组中的最小元素不是未排序中最前面的元素
        if(index>0){
            Array[index]=Array[i];
            Array[i]=min;
        }

    }
    Output(Array,n);
}

//冒泡排序
void BubbleSort(int Array[],int n){
    int i,j,temp,flag;
    //记住数组的个数
    int m=n;
    while(n){
        //此时的n是还未最终确定位置的元素个数
        //flag标记这一趟是否已经有序了
        flag=0;
        for(i=0;i<n-1;i++){
            if(Array[i]>Array[i+1]){
                temp=Array[i];
                Array[i]=Array[i+1];
                Array[i+1]=temp;
                //有元素位置的交换,说明不是有序,把flag记为1
                flag=1;
            }
        }
        if(flag==0)
            break;
        n--;
    }
    Output(Array,m);
}

//快速排序
void QuickSort(int Array[],int begin,int end){
    //数组中起码要有2个元素,否则就不用排了
    if(end>begin){
        int left,right,temp;
        //需要排序的首尾下标要保留下来,递归要用
        left=begin;
        right=end;
        //把最左边的元素当关键字key
        int key=left;
        while(left<right){
            //首先指针的位置指在要排序数组的最右边(因为选了最左边的为关键字key)
            //如果最右边的元素大于这个key,那就指针下标往左移
            while(Array[right]>=Array[key]&&left<right){
                right--;
            }
            //当右边指针指向的元素小于关键字key时,就比较排序数组左边的元素,自左向右找到第一个大于关键字key的元素
            while(Array[left]<=Array[key]&&left<right){
                left++;
            }
            //当左边找到大于key,右边小于key的元素后,交换这两个元素的位置
            temp=Array[left];
            Array[left]=Array[right];
            Array[right]=temp;
        }
        //交换完一轮之后,排序数组左边的元素都小于key,右边的元素都大于key,这个key的位置就放在排序素组的最中间
        //key的位置就完全确定了
        temp=Array[key];
        Array[key]=Array[left];
        Array[left]=temp;
        //此时的left会等于right或者right会小于left,所以这个key赋right
        key=right;
        //递归对左边的数组排序
        QuickSort(Array,begin,key-1);
        //对右边的数组排序
        QuickSort(Array,key+1,end);
    }
}


int main(){
    int Array[15]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
    int i;
    printf("排序原数据:");
    Output(Array,15);
    printf("\n排序后数据:");
    //InsertSort(Array,15);
    //ShellSort(Array,15);
    //SelectSort(Array,15);
    //BubbleSort(Array,15);
    QuickSort(Array,0,14);
    Output(Array,15);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leigm123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值