冒泡排序、交换排序、选择排序、插入排序、快速排序、SHELL排序

本文深入解析了六种常见的排序算法:冒泡排序、交换排序、选择排序、插入排序、快速排序与Shell排序。详细介绍了每种算法的工作原理、代码实现以及性能特点,旨在帮助读者理解不同排序算法的优劣,并在实际应用中做出合适的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1、 冒泡排序

void BubbleSort(int* pData,int Count)
{
   int iTemp;
   for(int i=1;i<Count;i++)
   {
     for(int j=Count-1;j>=i;j--)
     {
       if(pData[j]<pData[j-1])
       {
         iTemp = pData[j-1];
         pData[j-1] = pData[j];
         pData[j] = iTemp;
       }
     }
   }
}

 

2、 交换排序

void ExchangeSort(int* pData,int Count)
{
   int iTemp;
   for(int i=0;i<Count-1;i++)
   {
     for(int j=i+1;j<Count;j++)
     {
       if(pData[j]<pData[i])
       {
         iTemp = pData[i];
         pData[i] = pData[j];
         pData[j] = iTemp;
       }
     }
   }
}

 

3、 选择排序

void SelectSort(int* pData,int Count)
{
   int iTemp;
   int iPos;
   for(int i=0;i<Count-1;i++)
   {
     iTemp = pData[i];
     iPos = i;
     for(int j=i+1;j<Count;j++)
     {
       if(pData[j]<iTemp)
       {
         iTemp = pData[j];
         iPos = j;
       }
     }
     pData[iPos] = pData[i];
     pData[i] = iTemp;
   }
}

 

4、 插入排序

void InsertSort(int* pData,int Count)
{
   int iTemp;
   int iPos;
   for(int i=1;i<Count;i++)
   {
     iTemp = pData[i];
     iPos = i-1;
     while((iPos>=0) && (iTemp<pData[iPos]))
     {
       pData[iPos+1] = pData[iPos];
       iPos--;
     }
     pData[iPos+1] = iTemp;
   }
}

 

5、 快速排序

它的工作看起来仍然象一个二叉树。首先我们选择一个中间值middle程序中我们使用数组中间值,然后把比它小的放在左边,大的放在右边(具体的实现是从两边找,找到一对后交换)。然后对两边分别使用这个过程(最容易的方法——递归)。

void run(int* pData,int left,int right)
{
   int i,j;
   int middle,iTemp;
   i = left;
   j = right;
   middle = pData[(left+right)/2]; //求中间值
   do{
     while((pData[i]<middle) && (i<right))//从左扫描大于中值的数
       i++;    
     while((pData[j]>middle) && (j>left))//从右扫描大于中值的数
       j--;
     if(i<=j)//找到了一对值
     {
       //交换
       iTemp = pData[i];
       pData[i] = pData[j];
       pData[j] = iTemp;
       i++;
       j--;
     }
   }while(i<=j);//如果两边扫描的下标交错,就停止(完成一次)

   //当左边部分有值(left<j),递归左半边
   if(left<j)
     run(pData,left,j);
   //当右边部分有值(right>i),递归右半边
   if(right>i)
     run(pData,i,right);
}

void QuickSort(int* pData,int Count)
{
   run(pData,0,Count-1);
}

 

6、 SHELL排序

首先需要一个递减的步长,这里我们使用的是9、5、3、1(最后的步长必须是1)。工作原理是首先对相隔9-1个元素的所有内容排序,然后再使用同样的方法对相隔5-1个元素的排序以次类推。

void ShellSort(int* pData,int Count)
{
   int step[4];
   step[0] = 9;
   step[1] = 5;
   step[2] = 3;
   step[3] = 1;

   int iTemp;
   int k,s,w;
   for(int i=0;i<4;i++)
   {
     k = step[i];
     s = -k;
     for(int j=k;j<Count;j++)
     {
       iTemp = pData[j];
       w = j-k;//求上step个元素的下标
       if(s ==0)
       {
         s = -k;
         s++;
         pData[s] = iTemp;
       }
       while((iTemp<pData[w]) && (w>=0) && (w<=Count))
       {
         pData[w+k] = pData[w];
         w = w-k;
       }
       pData[w+k] = iTemp;
     }
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值