排序——交换排序
2020-11-30 本文已影响0人
vavid
一、冒泡排序
从前往后,把大的往后换
i
记录当前一趟排序结束后,最大元素应该存储的位置
j
指示每一趟排序中的当前元素,当该元素比其前一个元素进行对比,如果前一个元素比该元素大,则交换位置,直到一趟比较完成
void BubbleSort(int R[], int len){
int flag, temp;
for(int i = len - 1; i >= 1; i-- ){
flag = 0;
for(int j = 1; j <= i; ++j){
if(R[j-1] > R[j]){
temp = R[j];
R[j] = R[j-1];
R[j-1] = temp;
flag = 1;
}
}
if(flag == 0){ // 排序一趟若未发生交换,则证明序列有序,排序结束
return;
}
}
}
二、快速排序
取第一个元素作为枢轴元素,遍历后面的序列,依次比较,比枢轴元素的大的往后移动,比枢轴元素小的往前移动。
初始序列:
38 65 97 76 13 27
选第一个元素49作为枢轴元素,排序过程如下:
一趟排序结束:27 38 13 76 97 65
可以看出,一趟排序之后,初始序列被枢轴元素划分为两个子序列,分别再对两个子序列进行递归的快速排序,经过几趟之后,最终会得到有序序列。每趟排序对子序列的划分都是一次排序,这样一趟结束后就有一个关键字到达最终的位置。
void quickSort(int R[], int low, int high){
int temp;
int i = low; j = high;
if(low < high){
temp = R[low]; // 选定序列中第一个元素作为枢轴元素,并将该元素暂存下来
while(i < j && R[j] >= temp){
--j; // 从后往前找到第一个不小于枢轴元素的元素
}
if(i < j){
R[i] = R[j]; // 将当前这个较小的元素往前换
++i; // i所在位置的元素已被覆盖,i后移一位,j指针暂停
}
while(i < j && R[i] < temp){
++i; // 同理,从前往后找到一个大于枢轴元素的元素
}
if(i < j){
R[j] = R[i]; // 将当前这个较大的元素往后换
--j; // j所在位置的元素已被覆盖,j前移一位,i指针暂停
}
R[i] = temp; // i,j两个指针相遇,将枢轴元素放入i,j指针所指的位置
quickSort(R, low, i-1); // 再依次遍历枢轴元素左右的两个子序列
quickSort(R, i+1, high);
}
}