交换排序
来源:互联网 发布:cydia中文软件源 编辑:程序博客网 时间:2024/04/29 08:47
换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
应用交换排序基本思想的主要排序方法有:
- 冒泡排序(Bubble sort)
- 快速排序(Quick sort)
1. 冒泡排序
(1)冒泡排序思想
第一趟:
首先将第一个记录的关键字和第二个记录的关键字比较,若为逆序,则将两个记录交换之,然后比较第二个和第三个的关键字。以此类推,直至第n-1个记录和第n个记录关键字比较为止。该过程为第一趟排序,使得最大的关键字排到了最后面。
第二趟:
对前n-1个记录进行相同操作,完成后使得次大的关键字排在n-1位置上。
以此类推,进行第三、四次排序直到排序结束。
判断排序结束条件:在一趟排序过程中没有发生过交换记录的操作。一般第i趟排序是从第1个元素到(n-i+1)个记录依次比较相邻两个记录关键字,并在逆序时交换记录。
void bubble_sort(PList s) //冒泡排序{ int i, j, n, flag = 1; int temp; n = s->length ; for (i = 0; i < n-1 && flag; i++) //进行n-1次排序 { flag = 0; //标志位,若一次排序为发生交换,则排序结束 for (j = 1; j < n-i-1; j++) //每次比较长度减1 { if (s->data[j] > s->data[j-1]) //比较相邻元素,若顺序不对,则交换 { temp = s->data[j]; s->data[j] = s->data[j-1]; s->data[j-1] = temp; flag = 1; } } } }2.快速排序
通过一趟排序将待排记录分割成独立两部分,其中一部分记录的关键字均比另一部分记录的关键小,则可以分别对这两部分记录继续进行排序,以达到
这个序列有序。
设当前待排序的无序区为 data[low..high],在 data[low..high] 中任选一个记录作为基准(mid),以此基准将当前无序区划分为左、右两个较小的子区间 data[low..mid-1) 和 data[mid+1..high] ,左区间元素的值都小于基准值 data[mid],右区间元素的值都大于基准值 data[mid]。通过递归调用快速排序对左、右子区间 data[low..mid-1] 和 data[mid+1..high] 快速排序。两个递归调用结束时,其左、右两个子区间已有序。
(2) 快速排序算法
int quictsort_part(PList s, int low, int high) //快速排序子程序{ int temp; temp = s->data[low]; //基准,分割点,设置为第一个元素 while (low < high) { while (low<high && s->data[high] >= temp) //从右向左找第一个小于temp的元素 high--; s->data[low] = s->data[high]; //找到之后赋值给low位置 while (low<high && s->data[low] <= temp) //从左向右找第一个大于temp的元素 low++; s->data[high] = s->data[low]; //找到之后复制给high位置 } s->data[low] = temp; //更新分割点数据 return low; //返回分割点}void quicksort(PList s, int low, int high){ int mid; if (low < high) { mid = quictsort_part(s, low, high); //将序列分成两部分 quicksort(s, low, mid-1); //对左子序列快速排序 quicksort(s, mid+1, high); //对右子序列快速排序 }}
(3) 基准关键字的选择
在当前无序区中选取划分的基准关键字是决定算法性能的关键。
"三者取中"的规则:
- "三者取中"规则:即在当前区间里,将该区间首、尾和中间位置上的关键字比较,取三者之中值所对应的记录作为基准,在划分开始前将该基准记录和该区伺的第1个记录进行交换,此后的划分过程与上面所给的 Partition 算法完全相同。
- 取位于 low 和 high 之间的随机数 k,用 data[k] 作为基准:选取基准最好的方法是用一个随机函数产生一个取位于 low 和 high 之间的随机数 k(low≤k≤high),用 data[k] 作为基准,这相当于强迫 data[low..high] 中的记录是随机分布的。用此方法所得到的快速排序一般称为随机的快速排序。
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- CentOS7 时区设置.md
- c++修改文件名后缀 文件路径分解与批处理文件遍历
- 训练2 11题
- Linux(Ubuntu)下嵌入式gdb调试环境
- C++之继承
- 交换排序
- (Java实现)HDOJ 2064 汉诺塔III && 2077 汉诺塔IV
- 交叉工具链
- 字符串转整数一种实现
- Java IO学习
- Python 列表count()函数元素次数统计
- RTMP协议
- Linux下安装Oracle出现的一些错误,以及解决方法
- leetcode——81——Search in Rotated Sorted Array II