zoukankan      html  css  js  c++  java
  • C排序算法

    #include<stdio.h>
    #include<time.h>
    #include<stdlib.h>


    void CreatArry(int *P,int length);
    void Print(int Data[],int length );
    void DireInserSort(int *P,int length);
    void BinSort(int *P,int length);//二分法

    void BooSort(int *P,int length);

    void QuickSort(int *P,int low,int high); //high的下标表示
    int PartiTion(int *P,int i,int j);
    #define MaxLen 10
    int main(void )
    {
    int DataArr[MaxLen]={0};
    CreatArry(DataArr,MaxLen);
    Print(DataArr,MaxLen);

    //直接插入
    //DireInserSort(DataArr,MaxLen);

    //二分插入
    //BinSort(DataArr,MaxLen);

    //冒泡
    //BooSort(DataArr,MaxLen);

    //快速
    QuickSort(DataArr,0,MaxLen);
    Print(DataArr,MaxLen);
    getchar();
    }




    //自动产生数组函数
    //P 数组指针 length:数组长度,数组下标从0开始,
    //所以 最高界限为:length-1
    void CreatArry(int *P,int length)
    {
    srand(time(0));
    int i=0;
    for(i=0;i<length;i++)
    {
    *(P+i)=rand()%50+1;
    }
    }
    //打印函数
    void Print(int Data[],int length )
    {
    printf("顺序:");
    int i=0;
    for(i=0;i<length;i++)
    {
    printf(" %d",Data[i]);
    }
    printf("\n");
    }

    //直接插入
    void DireInserSort(int *P,int length)
    {
    printf("直接插入");

    int Temp;
    int i=0; //控制 总共的循环次数
    int j=0; //
    for(i=1;i<length;i++)
    {
    if(P[i]<P[i-1]) //判断待插入,与已排序的最后一位 比较
    {
    Temp=P[i]; //保存待插入的副本
    j=i-1;
    while(Temp<P[j]) //如果已序表的元素 比 X大, 就后退,
    {
    P[j+1]=P[j];
    j--;
    }
    P[j+1]=Temp;
    }
    }

    Print(P,length);
    }



    //二分插入
    void BinSort(int *P,int length)
    {
    printf("二分插入");
    int low=0,high=0, mid=0;
    int Temp;
    int i=0,j=0;
    for(i=1;i<length;i++)
    {
    low=0;
    high=i-1;//high=i,这是错误的, 当2 1 ;1为待插入数据 属于 low=0 high=0
    Temp=P[i];
    while(low<=high)
    {
    mid=(low+high)/2;
    if(Temp<P[mid])
    high=mid-1;
    else
    low=mid+1;
    }

    for(j=i-1;j>=low;j--) //j>high+1 注意j>=high+1
    {
    P[j+1]=P[j];
    }
    P[low]=Temp;
    }


    Print(P,length);

    }


    //冒泡
    void BooSort(int *P,int length)
    {
    printf("冒泡");
    int Temp; //哨兵
    int i,j;
    for(i=0;i<length;i++)
    {
    for(j=0;j<length-i-1;j++)
    {
    if(P[j+1]<P[j])
    {
    Temp=P[j];
    P[j]=P[j+1];
    P[j+1]=Temp;
    }
    }
    }
    Print(P,length);
    }


    //快速排序
    void QuickSort(int *P,int low,int high) //high的下标表示
    {

    int PriotPos=0;//基准位置



    if(low<high)
    {
    PriotPos=PartiTion(P,low,high);
    printf("第一次排序");
    Print(P,MaxLen);
    printf("\n");
    QuickSort(P,low,PriotPos-1);
    QuickSort(P,PriotPos+1,high);
    }

    }

    int PartiTion(int *P,int i,int j)
    {
    int Priot=P[i];
    while(i<j)//i<=j
    {
    while(i<j&&P[j]>=Priot)
    {j--;}
    //if(i<j)
    P[i]=P[j];

    while(i<j&&P[i]<=Priot)
    {i++;}
    //if(i<j)
    P[j]=P[i];


    }
    P[i]=Priot;
    return i;



    }
  • 相关阅读:
    oracle“记录被另一个用户锁住”
    Oracle CASE WHEN 用法介绍
    拥有机器人的人生会是怎样的体验?
    需求那么多,核心需求都从哪里来?
    一文读懂互联网及电商逻辑
    读书:《敏捷产品--不确定性的思维革命》
    读书:《超越感觉:批判性思考指南》一
    618啦,你的钱包又被盯上啦!
    产品经理如何开启上帝视角?
    我的产品经理价值观
  • 原文地址:https://www.cnblogs.com/shenlian/p/2296292.html
Copyright © 2011-2022 走看看