交换排序
1.冒泡排序
算法思想:假定无序序列长为len,从前往后两两比较相邻元素的值,若为逆序(a[i] > a[i+1]),则交换它们,直到序列比较完。这就是一趟冒泡,下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序列减少一个元素,每趟冒泡的结果就是把序列中的最小元素放在最终位置,最多需要len-1趟冒泡就可以排好序。
C语言代码:
#include<stdio.h>
#include<string.h>
#define len 5
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
//冒泡排序 时间复杂度O(n^2) 空间复杂度O(1)
void bubbleSort(int a[])
{
int i,j,flag;
for(i=0;i<len;i++)
{
//表示本趟冒泡是否发生交换标志
flag = 0;
for(j=0;j<len-i-1;j++)
{
if (a[j] > a[j+1])
{
flag = 1;
//交换
swap(a[j], a[j+1]);
}
}
//本趟遍历没有发生交换,说明表已经有序
if(flag == 0)
{
break;
}
}
}
int main()
{
int a[] = {45,14,27,71,12};
int i;
printf("未排序前:\n");
for(i=0;i<len;i++)
{
printf("%d ", a[i]);
}
printf("\n经过排序后:\n");
bubbleSort(a);
for(i=0;i<len;i++)
{
printf("%d ", a[i]);
}
}
2、快速排序
算法思想:在无序序列中任取一个元素作为基准(通常情况下选择第一个元素)。然后对无序序列分区,比基准元素大的放在它的右边,比它小的放在左边,对左右两个分区进行递归处理直到所有元素都变成有序。
C语言代码:
#include<stdio.h>
#include<string.h>
#define len 5
//快速排序分区间函数
int partition(int a[], int low, int high)
{
//将当前表第一个元素设为基准值,对表进行划分
int pivot = a[low];
//循环跳出条件
while(low < high)
{
while(low<high && a[high] >= pivot)
--high;
//比基准值小的值移动到左端
a[low] = a[high];
while(low<high && a[low] <= pivot)
++low;
//比基准值大的值移动到右端
a[high] = a[low];
}
//基准元素放到最终位置
a[low]= pivot;
//返回存放基准值的最终位置下标
return low;
}
void quickSort(int a[], int low, int high)
{
//递归跳出的条件
if(low<high)
{
//将数组a划分为两个子数组
int part = partition(a, low, high);
//依次对两个子表进行递归排序
quickSort(a, low, part-1);
quickSort(a, part+1, high);
}
}
int main()
{
int a[] = {45,14,27,71,12};
int i;
printf("未排序前:\n");
for(i=0;i<len;i++)
{
printf("%d ", a[i]);
}
printf("\n经过排序后:\n");
quickSort(a, 0, len);
for(i=0;i<len;i++)
{
printf("%d ", a[i]);
}
}