【说明】以下代码实现最终均为递增序列,即从小到大排序。
#include<stdio.h>
#define ElemType int
/*函数声明*/
void swap(int& a, int& b); //1-1.交换
void BubbleSort(ElemType A[], int n); //1-2.冒泡排序
int Partition(ElemType A[], int low, int high); //2-1.划分
void QuickSort(ElemType A[], int low, int high); //2-2.快速排序
//1-1.交换
void swap(int& a, int& b) { //涉及两个元素实际交换,要带引用
int temp = a;
a = b;
b = temp;
}
//1-2.冒泡排序
void BubbleSort(ElemType A[], int n) {
for (int i = 0; i < n - 1; i++) { //若每趟均要交换,则共n-1趟冒泡
bool flag = false; //代表本趟冒泡是否发生交换的标志
for (int j = n - 1; j > i; j--) //一趟冒泡过程
if (A[j - 1] > A[j]) { //若为逆序
swap(A[j - 1], A[j]); //交换
flag = true; //更改标志位,本趟发生交换
}
if (flag == false)
return; //本趟遍历没有发生交换,说明表已经有序,提前结束算法
}
}
//2-1.划分
int Partition(ElemType A[], int low, int high) { //一趟划分
ElemType pivot = A[low]; //将表中第一个元素作为枢轴
while (low < high) { //用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; //返回存放枢轴的最终位置
}
//2-2.快速排序
void QuickSort(ElemType A[], int low, int high) {
if (low < high) { //递归跳出的条件
int pivotpos = Partition(A, low, high); //划分
QuickSort(A, low, pivotpos - 1); //依次对两个子表进行递归排序
QuickSort(A, pivotpos + 1, high);
}
}
int main() {
//1.冒泡排序
ElemType A[] = { 10,9,8,7,6,5,4,3,2,1 };
BubbleSort(A, 10);
for (int i = 0; i < 10; i++)
printf("%d\t", A[i]);
printf("\n");
//2.快速排序
ElemType B[] = { 10,9,8,7,6,5,4,3,2,1 };
QuickSort(B, 0, 9);
for (int i = 0; i < 10; i++)
printf("%d\t", B[i]);
return 0;
}
一、交换排序的概念
二、关于两种交换排序的性能分析
三、其他说明