c语言排序法{几大经典排序法}【内含详细程序分析过程】(详细易懂版)

插入排序法(直接插入)

int i,j,a[7],temp;            \\先设定一个可以含有7个数字的数组(这个7根据需要改变)
	for(i=1;i<7;i++)
	{
        temp=a[i];            \\a[i]就是你要插入排序的牌,先用temp将此时i指向的数字保存下来
		for(j=i-1;j>=0;j--)   \\j=i-1并且j--,就是将a[i]前面的数字逐个与temp比较
		{
			if(a[j]>temp) 
			{
				a[j+1]=a[j];   \\当a[j]比temp大时,就往后移一个位置
			}
			else break;		   \\当遇到一个不比temp大的数字时,就跳出循环(也就是找到插入点了)
		}
		a[j+1]=temp;           \\此时的a[j]是恰好不比temp大的数字,所以将temp插入到a[j+1]处
	}

思路:直接插入法,其实就类似拿着一副扑克牌,将扑克牌按从小到大的顺序排好。比如:你看到一张3,你要将它排好。就是要拿这张3跟它前面的牌比较。将它插入到第一次遇到比它小的牌后面。因为如果你一开始就按这种方式排序,那么3前面的牌都是有序的,用这种算法就可以实现插入排序。

选择排序法

int i,t,a[7],j;               \\先设定含有7个数字的数组(这个7可以根据需要改变)
	for(i=0;i<7;i++)          \\a[i]指的是正在被排序的位置(经历完算法,这个位置就被排好序了)
	{
		for(j=i+1;j<7;j++)    \\a[j]指的是a[i]后的所有的数
		{
			if(a[j]<a[i])     \\当a[j]比a[i]小,就将a[j]与a[i]交换
			{
				t=a[j];
				a[j]=a[i];
				a[i]=t;
			}
		}
	}

思路:选择排序——假如有一组数7,6,5,4,3,2,1,(排升序)那么第一个位置应该是最小的数,所以将第一个位置上的数与后面每一个数进行比较,当出现比7小的数就将7和那个比7小的数交换,这样在遍历完这组数后,第一个位置上的数字就是1。然后就排第2个位置的数,之后以此类推·····(但是这个算法速度慢,显而易见地,它每一次排序都是将相应位置之后的数字遍历一遍,那么最后,这个算法遍历的次数是n-1!(n为数字的个数))

冒泡排序法

int i,t,a[7],j;
		for(i=0;i<7;i++)        \\i指需要经历冒泡算法的次数(有多少数就需要多少次冒泡)
		{
			for(j=0;j<7-i-1;j++) \\j<7-i-1即可(因为经历了i冒泡就有i个数被排好,所以不需要)
			{                    \\a[j]指正在被冒泡的数
				if(a[j]>a[j+1])   \\当a[j]比a[j+1]大,就将两者交换
				{
					t=a[j];
					a[j]=a[j+1];
					a[j+1]=t;
				}               \\如果a[j]不比a[j+1]大,就不交换,j++,使新的a[j]与a[j+1]比较
			}
		}
	}

思路:冒泡排序——假如有7,4,5,6,3,2,1一组数。首先当i=0时,经历第一次冒泡排序。(j=0)将7,4进行比较,7,4交换。接着将(j=1)将7,5比较,7,5交换。以此类推,经历完第一次冒泡,7就在最后。第二次冒泡:(j=0)将4,5比较,4,5不交换。(j=1)将5,6比较,5,6不交换。(j=2)将6,3比较,6,3交换。以此类推就能将这组数排好。

快速排序法

int quicksort(int a[],int start,int end)  
{
   int i=start;        \\因为后面的函数会用到start和end并进行修改,所以为了不破坏原来数据
   int j=end;
   int t=a[start];    \\一开始将a[start]作为基数
   if(start<end)      \\start<end是必要条件,当start=end时,就排序完成
   {
      while(i<j)
    {
      while(i<j&&a[j]>t)  \\所有的语句都要保证i<j,不然在执行语句时,很大可能会出错(j<i)
      {
         j--;          \\这个语句就是保证a[j]都是大于基数,当a[j]<=基数就跳出语句
      }
      
      if(i<j)
      {
         a[i++]=a[j];   \\此时a[j]<=基数,所以给a[i]赋a[j]的值,并让i++。然后进入i的循环
      }                  \\此时a[j]右边全是比基数大的数
     
      while(i<j&&a[i]<t)  \\这个语句要最后a[i]左边全是比基数小的数,遇到大于基数就跳出循环
      {
         i++;
      }
     
      if(i<j)   
      {
         a[j--]=a[i]; \\此时a[i]刚好比基数大,而a[j]右边全是比基数大的数,a[j]刚好比基数小
      }              \\把a[i]赋给a[j],并让j--。此时a[j]和它右边的数全是比基数大的数
     }
   }                  
   a[i]=k;           \\循环结束此时i=j,排序完成,a[i]就是基数所在的位置
   quicksort(a[],start,i-1);   \\再进行递归排序
   quicksort(a[],i+1,end);
}

思路:代码框内写得很详细了。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值