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

来源:互联网 发布:faceu软件下载 编辑:程序博客网 时间:2024/06/05 04:54

交换排序主要有两种 冒泡 和 快速排序
冒泡排序:稳定,时间复杂度 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);
}


}