排序算法动图详解与代码实现(交换排序篇)

1.冒泡排序
思想:从第一个元素开始,两两比较相邻元素a1,a2,当a1>a2时,交换顺序,比较下一组元素,循环操作,直到整个数组有序。
在这里插入图片描述
优点:稳定

缺点:效率低

代码实现

void bubble_sort(int* arr,int len)
{
    if(arr == NULL || len < 0)
        return ;
    bool flag = true;
    for(int i=0;i<len-1 && flag;i++)
    {
        flag = false;
        for(int j=0;j<len-i-1;j++)
        {
            if(arr[j] > arr[j+1])
            {
                flag = true;
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

2.快速排序
思想:首先确定基准点的值,目地是将基准点防止到指定位置,使得左边数据小于基准点,右边数据大于基准点,随后进行左右子串的递归排序,直到整个数组有序。

算法解读:选取中间变量暂存基准点的值,指定i,j两个指针,i指针从后向前遍历,直到找到比基准点小的数据后停下,用该数据的值覆盖基准点位置上的值,随后j指针从前向后遍历,直到找到比基准点大的数据后停下,用该数据的值覆盖i指针位置上的值,重复i,j指针的遍历,直到i=j,用基准点上的值覆盖该位置上的值,完成一次基准点位置的确认,然后进行左右子串的递归遍历,直到整个数组有序。
ps:动图所展示的在找到基准点后子串的排序算法与常见快排略有不同,代码实现以上述提到的思想为主,动图仅供参考。

优点:数据移动少

缺点:不稳定

代码实现

#include <stdio.h> 

void sort(int a[], int left, int right) {
	if(left >= right)//如果left大于或者等于right就代表已经整理完成一个部分了 
	{ return;} 
	int i = left;
	int j = right;
	int key = a[left];//选取基准点
	while(i < j)//当i和j"相遇"的时候,说明所有元素都被比较了一遍,这时候就不用再循环
    {
    	 while(i < j && key <= a[j]) {
      	 j--;//向前寻找 } 
      	 a[i] = a[j];//数值覆盖
    	 while(i < j && key >= a[i]) { 
       	 i++;//向后寻找} 
        a[j] = a[i];//数值覆盖
     }
        a[i] = key;//确定基准点位置
        sort(a, left, i - 1);//对左子串进行递归排序
        sort(a, i + 1, right);//对右子串进行递归排序
 }

void main() { 
  int a[]={5,6,1,4,9,2,9};
  int i; 
  int length=sizeof(a)/sizeof(int); 
  sort(a,0,length-1); 
  for(i=0;i<length;i++){
   printf("%d\t",a[i]);} 
   printf("\n"); 
 }

3.二者复杂度比较
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值