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