常用排序算法

1、插入排序:假设数组A[0,...,n-1],A[0,...,p]按照从小到大的顺序排序完毕,将A[p+1,...,n-1]中元素一次与之前元素比较,并插入至相应位置,算法复杂度为n^2(符号省略,下同)

void INSERT_SORT(int *A,int len)

{

for(int i=1;i<len;i++)

 {

    int key=A[i];

    int j=i-1;

    while(j>=0&&A[j]>key)

    {

    A[j+1]=A[j]; 

   j--;

    }   

   A[j+1]=key;

}

}

2、冒泡排序:不断比较相邻两个元素,若前者大于后者,二者交换位置,直至遍历完全,算法复杂度n^2

 void BUBBLE_SORT(int* A,int len)

{

  for(int i=1;i<len;i++)//正序遍历

    for(int j=0;j<len-i;j++)

    {

    if(a[j]>a[j+1])

      {

        int tmp=a[j+1];

       a[j+1]=a[j];

       a[j]=tmp;

      }

    }

}

3、选择排序:从未排序部分中以此选出最小元素,置入已排序部分,算法复杂度n^2

 void SELECT_SORT(int *A,int len)

{

  for(int i=0;i<len-1;i++)

   {

    int min_index=i;

    for(int j=i+1;j<len;j++)

       if(A[j]<A[min_index])  min_index=j;

    if(min_index!=i)

      {

       int tmp=A[i];

      A[i]=A[min_index];

      A[min_index]=A[i];

      }

   }

}

4、归并排序:分成两部分分别排序,再将排序好两部分合并,递归完成,算法复杂度nlogn

 void MERGE(int *A,int p,int q,int r)

{

   int n1=q-p+1;

   int n2=r-q;

   int *L=new int[n1];

   int *R=new int[n2];

   for(int i=0;i<n1;i++)

     L[i]=A[p+i];

   for(int i=0;i<n2;i++)

    R[i]=A[i+q];

  int i=1;

  int j=1;

   for(int k=p;k<=r;k++)

   {

  if(L[i]<=R[j])

  {A[k]=L[i];i++;}

  else

  {A[k]=R[j];j++;}

   } 

}

void MERGE_SORT(int *A,int p,int r)

{

   if(p<r)

   {

   int q=(p+r)/2;

   MERGE_SORT(A,p,q);

   MERGE_SORT(A,q+1,r)

   MERGE(A,p,q,r);

   }

}

5、堆排序:这里的堆是一个近似完全二叉树,父结点>=或<=子结点的是最大或最小堆

void MAX_HEAPIFY(int* A,int i,int len)//维护最大堆

{

   int l=2*i+1;

   int r=2*i+2;

   int largest=i;

   if(l<len&&A[l]>A[largest])  largest=l;

   if(r<len&&A[r]>A[largest]) largest=r;

   if(largest!=i){

   int tmp=A[i];

   A[i]=A[largest];

   A[largest]=tmp;

   MAX_HEAPIFY(A,largest,len);

  }

}

void BUILD_MAX_HEAP(int* A,int len){//建堆

    for(int i=len/2-1;i>=0;i--){

      MAX_HEAPIFY(A,i,len);

   }

}

 

void HEAPSORT(int* A,int len)//堆排序

{

  BUILD_MAX_HEAP(A,len);

  for(int i=len-1;i>0;i--){

     int tmp=A[0];

     A[0]=A[i];

     A[i]=tmp;

     len=len-1;

     MAX_HEAPIFY(a,1,len);

  }

}

6、快速排序:数组A[p,...,r]划分为两子数组A[p,...,q-1]和A[q+1,...,r],使得前者每个元素小于A[q],后者每个元素大于A[q],递归完成,算法复杂度n^2

 int PARTION(int* A,int p,int r)//以A[r]为基元

{

   int x=A[r];

   int i=p-1;

   for(int j=p;j<r;j++)

   {

   if(A[j]<=x){

      i++;

      int tmp=A[i];

      A[i]=A[j];

      A[j]=tmp;

   }

   }

   int tmp=A[i+1];

      A[i+1]=A[r];

      A[r]=tmp;

 

return i+1;

}

void QUICKSORT(int* A,int p,int r)

{

if(p<r)

{

  int q=PARTION(A,p,r);

  QUICKSORT(A,p,q-1);

  QUICKSORT(A,q+!,r);

}

}

 

7、计数排序:对每一个输入元素x,确定小于x的元素个数,放在输出数组相应位置上;当有几个相等的元素时,从按序放置

A中存储元素为非负整数

void COUNTING_SORT(int* A,int* B, int k,int len)//k为A中最大元素取值,len为A中存放元素个数

{

    int *C=new int[k+1];

    for(int i=0;i<=k;i++)

         C[i]=0;

     for(int j=0;j<len;j++)//等于各取值的元素数目

        C[A[j]]=C[A[j]]+1;

      for(int i=0;i<=k;i++)//小于各取值的元素数目

        C[i]+=C[i-1];

     

      for(int j=len-1;j>=0;j--)

      {

         B[C[A[j]]]=A[j];

         C[A[j]]=C[A[j]]-1;

      }//输出数组

}

 

8、基数排序:从低位只高位依次比较排序,算法复杂度d(n+k)

认为数字都是非负整数

int getDigit(int a,int k)//获得第k位数字

{

   for(int i=1;i<k;i++)

    {

    a=a/10;

    }

    return a%10;

}

 

void RADIX_SORT(int* A,int d,int len)

{

  for(int i=0;i<d;i++)

  {

   int *B=new int[len];

   for(int j=0;j<len;j++)

   {

   B[j]=getDigit(A[j],i+1);

   }

    //数组A按照第i位数字排序

    for(int j=1;j<len;j++)//插入排序

    {

    int key=B[j];

    int k=j-1;

    while(k>=0&&B[k]>key)

    {

    A[k+1]=A[k];

    k--;

    }

    A[k+1]=A[j];

    } 

  }

}

 

【基于QT的调色板】是一个使用Qt框架开发的色彩选择工具,类似于Windows操作系统中常见的颜色选取器。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备,支持C++和QML语言。这个调色板功能提供了横竖两种渐变模式,用户可以方便地选取所需的颜色值。 在Qt中,调色板(QPalette)是一个关键的类,用于管理应用程序的视觉样式。QPalette包含了一系列的颜色角色,如背景色、前景色、文本色、高亮色等,这些颜色可以根据用户的系统设置或应用程序的需求进行定制。通过自定义QPalette,开发者可以创建具有独特视觉风格的应用程序。 该调色板功能可能使用了QColorDialog,这是一个标准的Qt对话框,允许用户选择颜色。QColorDialog提供了一种简单的方式来获取用户的颜色选择,通常包括一个调色板界面,用户可以通过滑动或点击来选择RGB、HSV或其他色彩模型中的颜色。 横渐变取色可能通过QGradient实现,QGradient允许开发者创建线性或径向的色彩渐变。线性渐变(QLinearGradient)沿直线从一个点到另一个点过渡颜色,而径向渐变(QRadialGradient)则以圆心为中心向外扩散颜色。在调色板中,用户可能可以通过滑动条或鼠标拖动来改变渐变的位置,从而选取不同位置的颜色。 竖渐变取色则可能是通过调整QGradient的方向来实现的,将原本水平的渐变方向改为垂直。这种设计可以提供另一种方式来探索颜色空间,使得选取颜色更为直观和便捷。 在【colorpanelhsb】这个文件名中,我们可以推测这是与HSB(色相、饱和度、亮度)色彩模型相关的代码或资源。HSB模型是另一种常见且直观的颜色表示方式,与RGB或CMYK模型不同,它以人的感知为基础,更容易理解。在这个调色板中,用户可能可以通过调整H、S、B三个参数来选取所需的颜色。 基于QT的调色板是一个利用Qt框架和其提供的色彩管理工具,如QPalette、QColorDialog、QGradient等,构建的交互式颜色选择组件。它不仅提供了横竖渐变的色彩选取方式,还可能支持HSB色彩模型,使得用户在开发图形用户界面时能更加灵活和精准地控制色彩。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值