# 3. 交换类排序
# 1. 冒泡排序
(相邻比序法)
基本思想:
通过不断比较相邻元素大小,进行交换实现排序。
第一趟排序:
首先将第一个元素和第二个元素比较大小,若为逆序,则交换;然后比较第二个与第三个,一直到第 n-1 和第 n 个,这样就使最大的元素放到了最后一个位置。
void BubbleSort(SqList *L){ | |
for(int i=1; i<L->length; i++){ | |
flag=1; | |
for(j=1;j<L->length-i;j++){ | |
if(L->data[j] > L->data[j+1]){ | |
temp= L->data[j]; | |
L->data[j]= L->data[j+1]; | |
L->data[j+1]=temp; | |
flag=0; | |
} | |
} | |
if (flag=1) break; | |
} | |
} |
性能分析:
最好情况正序:O (n)
最坏情况逆序:O (n2)
时间复杂度 O (n2)
空间复杂度 O (1)
稳定
# 2. 快速排序
基本思想
以某个记录为界(支点或枢轴),将待排序列分成两部分,一部分所有记录的关键码小于支点记录的关键码,而另一部分大于支点的关键码。然后对每一部分再划分,直至整个序列有序。
// 完整的快速排序算法 | |
/* 对记录数组 r [low..high] 用快速排序算法进行排序 */ | |
void QKSort(RecordType r[],int low, int high ){ | |
if(1ow<high){ | |
pos=QKPass(r, low, high); /* 调用一趟快速排序,将枢轴元素为界划分两个子表 */ | |
QKSort(r, low, pos-1); /* 对左部子表快速排序 */ | |
QKSort(r, pos+1, high); /* 对右部子表快速排序 */ | |
} | |
} | |
// 一趟快速排序算法 | |
/* 对记录数组 r 中的 r [left] 至 r [right] 部分进行一趟排序,并得到基准的位置,使得排序后的结果满足其之后(前)的记录的关键字均不小于(大于)于基准记录 */ | |
int QKPass(RecordType r[],int left,int right){ | |
x= r[left]; /* 选择基准记录 */ | |
low=left ; | |
high=right; | |
while ( low<high ){ | |
/* high 从右到左找小于 x.key 的记录 */ | |
while (low< high && r[high].key>=x.key ) high--; | |
if ( low <high ) { | |
r[low]= r[high]; | |
low++; | |
} | |
/* 找到小于 x.key 的记录,则进行交换 */ | |
while (low<high && r[low].key<x.key )low++; /* low 从左到右找大于 x.key 的记录 */ | |
/* 找到大于 x.key 的记录,则交换 */ | |
if ( low<high ) { | |
r[high]= r[low]; | |
high--; | |
} | |
} | |
r[low]=x; /* 将基准记录保存到 low=high 的位置 */ | |
return low; /* 返回基准记录的位置 */ | |
} /* QKPass */ |
性能分析:
最好情况:O (nlog2n)
最坏情况:O (n2)
时间复杂度 O (nlog2n)
空间复杂度 O (log2n)
不稳定