有排序分类图:
今天主要分析交换排序,既冒泡排序和快速排序。
1.冒泡排序:
排序思路:冒泡法也叫下沉法。
第一趟:从第一个数开始,和下一个相邻的数比较,大的数往下“沉”;接着和下一个相邻的数比较,直至一个数组遍历完。
第二趟:从第一个数开始,除过已“下沉”的数,对剩下所有的数进行相邻两数比较,大的数往下“沉”。
.........
第n-1趟:以此类推,直到所有数都成为“下沉”数。
嗯哼,思路有点绕,不急,不急!还有图示法,^o^
假如有一组数据:263,29,6,3287,232,8;对其进行冒泡排序,如下图:
代码实现:
#include<stdio.h>
void BubbleSort(int arr[], int len)//冒泡排序
{
int tmp;
bool mark = false;
for (int i = 0; i < len-1; i++)//趟数
{
mark = false;
for (int j = 0; j < len - 1 - i; ++j)
{
if (arr[j]>arr[j + 1])
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
mark = true;
}
}
printf("i = %d\n", i);
if (!mark)
{
break;
}
}
}
int main()
{
int arr[] = { 263,29,6,3287,232,8};
int len = sizeof(arr) / sizeof(arr[0]);
BubbleSort(arr, len);
for(int i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
2.快速排序
排序思路:分治法。在每一趟中,先选一个基准,在剩下的数中把比基准数小的数放到左边,大的数放到右边。
示例:有一组数据:263,29,6,3287,232,8,利用快速排序进行排序,图示如下:
代码实现:
#include<stdio.h>
int partition(int arr[], int low, int high)//对每一小组进行调整
{
int tmp = arr[low];//tmp存放基准数
while (low < high)
{
while (low < high && arr[high] >= tmp)high--;
arr[low] = arr[high];//把比基准数小的数放在前边
while (low < high && arr[low] <= tmp)low++;
arr[high] = arr[low];//大的数放到后边
}
arr[low] = tmp;//把基准数插入到找到的位置
return low;//返回当前基准点
}
void QSort(int arr[], int low, int high)//用递归对基准点左右进行分组
{
if (low < high)
{
int boundKey = partition(arr,low, high);//找上一趟中基准点最后插入的位置
QSort(arr,low,boundKey - 1);
QSort(arr,boundKey + 1,high);
}
}
void QuickSort(int arr[], int len)
{
QSort(arr, 0, len - 1);
}
int main()
{
int arr[] = {263,29,6,3287,323,8};
int len = sizeof(arr) / sizeof(arr[0]);
QuickSort(arr,len);
for (int i = 0; i < len; ++i)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
以上就是交换排序啦。