排序

希尔排序

在这里插入图片描述

function shellSort(arr)
{
    var len = arr.length;
    for (var gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2))
    {
        // 注意:这里和动图演示的不一样,动图是分组执行,实际操作是多个分组交替执行
        for (var i = gap; i < len; i++)
        {
            var j = i;
            var current = arr[i];
            while (j - gap >= 0 && current < arr[j - gap])
            {
                arr[j] = arr[j - gap];
                j = j - gap;
            }
            arr[j] = current;
        }
    }
    return arr;
}

归并排序

在这里插入图片描述

void f(int n,int m)
{
    int i,j,k,mid;
    if(n<m)
    {
        mid=(n+m)/2;
        int i=n,j=mid+1,k=n;
        f(n,mid);
        f(mid+1,m);
        while(i<=mid&&j<=m)
        {
            if(a[i]<=a[j])
                b[k++]=a[i++];
                else
                   {
                       b[k++]=a[j++];
                       w+=mid-i+1;
                   }
        }
        while(i<=mid)  //还要考虑剩余的
            b[k++]=a[i++];
        while(j<=m)
            b[k++]=a[j++];
        for(i=n;i<=m;i++)
            a[i]=b[i];
    }
}

快排

在这里插入图片描述

void sort(int a[],int start,int end)
{
    int i,j,t;
    i=start;
    j=end;
    int temp=a[start];
    if(start>end)
        return ;
    while(i<j)
    {
        while(i<j&&a[j]>=temp)
        {
            j--;
        }
        while(i<j&&a[i]<=temp)
        {
            i++;
        }
       if(i<j)
       {
           t=a[i];
           a[i]=a[j];
           a[j]=t;
       }
    }
    a[start]=a[i];
    a[i]=temp;
    sort(a,start,i-1);
    sort(a,i+1,end);
}

插入排序

在这里插入图片描述

void insertion_sort(int *number,int n)    //定义一个插入函数"insertion_sort" 
{
    int i=0,ii=0,temp=0;  
    for(i=1;i<n;i++)  //循环遍历 
    {
        temp=number[i];  //将temp每一次赋值为number[i] 
        ii=i-1;  
        while(ii>=0&&temp<number[ii])   //这里改顺序 (temp后的)"<"为小到大,">"为大到小 !!!
        {
            number[ii+1]=number[ii];    //将大的元素往前放 
            ii--; 
        }
        number[ii+1]=temp;   //与"number[ii+1]=number[ii];"一起意为 
    }              //如果插入的数比之前的大,将number[ii]与number[ii+1]互换 
}

选择排序

在这里插入图片描述

void select_sort(int R[],int n)    //定义选择排序函数"select_sort" 
{
    int i,j,k,index;    //定义变量 
    for(i=0;i<n-1;i++)   //遍历 
    {
        k=i;
        for(j=i+1;j<n;j++)    //j初始不为0,冒泡初始为0,所以选排比冒泡快,但不稳定 
        {
            if(R[j]<R[k])   //顺序从这里改顺序 小到大"<",大到小">" !!!
                k=j;      //这里是区分冒泡排序与选择排序的地方,冒泡没这句 
        }
        if(k!=j)    //为了严谨,去掉也行 
        {
            index=R[i];   //交换R[i]与R[k]中的数 
            R[i]=R[k];    //简单的交换c=a,a=b,b=c 
            R[k]=index;
        }
    }
}

冒泡排序

在这里插入图片描述

for(j=0;j<n-1;j++)
for(i=0;i<n-j-1;i++)
{
    if(a[i]>a[i+1])
  {  
   t=a[i];
    a[i]=a[i+1];
     a[i+1]=t;
  }
}

堆排序

在这里插入图片描述

#include<stdio.h>
int a[100];
void Exchange(int i,int n)//将最大叶子结点与根结点交换 
{
 int temp;
 temp = a[i];
 a[i] = a[n];
 a[n] = temp;
}
void Created(int n)
{
 if(n == 2){//当只剩两个的时候,直接比较大小 先输出最大的 然后输出最小的 
  if(a[0] > a[1]){
   printf("%d %d\n",a[0],a[1]);
  }
  else
   printf("%d %d\n",a[1],a[0]);
  return;
 }
 int i;
 for(i = n/2-1;i >= 0; i--) //比较每一个根结点与其叶子结点的大小   并且将大于根结点的叶子结点与根结点交换 
 {//最后一个根结点是第n/2个 但是第一个数下标为0  所以最后一个根结点下标为n/2-1 
  if(a[2*i+1] > a[i] && 2*i+1 < n)//与左孩子进行比较 
   Exchange(i,2*i+1);
  if(a[2*i+2] > a[i] && 2*i+2 < n)//与右孩子进行比较 
   Exchange(i,2*i+2);
 }
 int t;
 t = a[0];//将第一个根结点与最后一个叶子结点互换 
 a[0] = a[n-1];
 a[n-1] = t;
 printf("%d ",a[n-1]);//输出最大的结点 
 Created(n-1);//将是输出的结点弹出 
}
int main()
{
 int  n;
 printf("请输入需要排序的元素的个数:");
 scanf("%d",&n);
 printf("请输入%d个元素:",n);
 for(int j =0; j <n; j++)
 {
  scanf("%d",&a[j]);
 }
 Created(n);
 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值