目录
移动排序
冒泡排序
flag盯是不是排好了
(为什么感觉老师的错了,第二个for的第二个判断
条件)
void BubbleSort(SqList &L , int n){
int m , u, flag = 1; //m 趟数 , n 元素个数 , u 每趟比大小次数
RedType x;
for(m = 1 ; m <= n - 1 && flag == 1; m++){
flag = 0;
for(u = 1 ; u <= n - m ; u++){
if(L.r[u].key < L.r[u + 1].key){
flag = 1;
x = L.r[u];
L.r[u] = L.r[u + 1];
L.r[u + 1] = x;
}
}
}
}
算法分析
比较发现一次逆序,赋值3次
∴乘3
快速排序
原理
↑太浪费空间啦!
↓先把中心点放界点,low high 间断比较
代码实现
int Partition(SqList &L , int low , int high){
L.r[0] = L.r[low];
int pivotkey = L.r[low].key;
while(low < high){
while(low < high && L.r[high].key >= pivotkey){
high--;
}
L.r[low] = L.r[high];
while(low < high && L.r[low].key <= pivotkey){
low++;
}
L.r[high] = L.r[low];
}
L.r[low] = L.r[0];
return low;
}
void QSort(SqList &L , int low , int high){
if(low < high){
int pivotloc = Partition(L , low , high);
QSort(L , low , pivotloc - 1);
QSort(L , pivotloc + 1 , high);
}
}
#include<stdlib.h>
qsort 香啊
算法分析
基本有序(不论递增或递减)
越乱越快(改变中心点的选取)
选择排序
入门
代码实现
#include<stdio.h>
#define MAXSIZE 20
typedef int KeyType;
typedef int InforType;
typedef struct{
KeyType key;
InforType otherinfor;
}RedType;
typedef struct{
RedType r[MAXSIZE + 1];
int length;
}SqList;
void SelectSort(SqList &L){
for(int i = 1 ; i < L.length ; i++){
int k = i;
for(int j = i + 1 ; j <= L.length ; j++){
if(L.r[j].key < L.r[k].key){
k = j;
}
}
if(k != i){
RedType swap = L.r[k];
L.r[k] = L.r[i];
L.r[i] = swap;
}
}
}
每次在无序里挑一个最小(最大)的,放到无序的头,有序的加一
算法分析
但可以通过优化,变成稳定排序
堆排序
原理
双亲结点 n 的左孩子 2n
右孩子 2n + 1
堆调整
代码实现
堆建立
代码实现
算法分析
(时间效率贼稳定)
归并排序
(归并树)
趟数等于树的高度