交换排序——冒泡和快速排序

本文介绍了两种常见的交换排序算法——冒泡排序和快速排序。冒泡排序是一种稳定的排序算法,时间复杂度为O(n^2)。快速排序则是一种不稳定的排序方法,其最优时间复杂度为O(nlogn),但在最坏情况下会退化至O(n^2)。文章详细阐述了这两种算法的基本思想、操作步骤及其实现方式。
摘要由CSDN通过智能技术生成

交换排序主要有两种 冒泡 和 快速排序
冒泡排序:稳定,时间复杂度 O(n^2) 
将待排序的数组看做是重量不同的泡泡,从后往前遍历,把重量轻的交换到上面,(即如果data[j] < data [j -1],那么交换顺序),经过一轮遍历之后最轻的泡泡就到了最上面,然后对没有排序好的数组继续前面的过程,直到最后完成


void bubblesort(int data[], int len)
{
  if(len <= 1)
    return;

  int value = 0;
  int i =0;
  int j =0;
  //tag用来标识是否是一个已经排好序的数据源,
  //如果第一次遍历没有发生交换就认为是排好序的,故直接退出
  int tag = 0;
  
  for(i = 0; i < len; i++)
  {
    for(j = len-1; j > i; j--)
{
 if (data[j] < data[j - 1])
 {
   value = data[j];
   data[j] = data[j - 1];
data[j - 1] =value;
tag = 1;
 }
}

if(tag == 0)
 break;
  }


}

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


快速排序: 不稳定,时间复杂度 最理想 O(nlogn) 最差时间O(n^2)
基本思想是:
1.先从数列中取出一个数作为基准数,一般选取第一个,也有选取中间值。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。

所以最重要的就是第二步,实现如下
1)设置两个变量I、J,排序刚开始的时候:I=0,J=N-1;
2)判断是否结束,这是递归算法的出口,即 I < J
3)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];
4)从J开始向前搜索,即由后开始向前搜索(J=J-1即J--),找到第一个小于key的值A[j],A[j]与A[i]交换;
5)从I开始向后搜索,即由前开始向后搜索(I=I+1即I++),找到第一个大于key的A[i],A[i]与A[j]交换;
6)重复第4、5步,直到 I=J; (4,5步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后另循环结束。)

void quicksort(int data[], int low, int high)
{
int value = data[low];
int front = low;
int end = high;
int middle = 0;


if(low < high)
{
  while(low < high)
  {
 while(low < high)
 {
if(data[high] < value)
{
 break;
}
high--;
 }
 
 if(data[high] < value)
 {
data[low] = data[high];
low++;
 }
 
 while(low < high)
 {
if(data[low] > value)
{
 break;
}
low++;
 }
 
 if(data[low] > value)
 {
data[high] = data[low];
data[low] = value;
middle = low;
 }
 else
 {
data[high] = value;
middle = high;
 }
  }
  quicksort(data, front, middle -1);
  quicksort(data, middle + 1, end);
}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值