排序
冒泡排序:
一种比较容易理解的排序算法,可以优化的程度也比较有限
平均:O(n^2)
最坏:O(n^2)
最好:O(n)
最好情况需要在进行循环之前加入标志位,若一次遍历中,没有任何两个数据被交换,则认为序列已经有序,跳出循环。此时,时间复杂度为O(n)
插入排序:
选择一个数据插入到前面已经排好的有序队列之中
平均:O(n^2)
最坏:O(n^2)
最好:O(n)
这两种算法中规中矩,便于理解但是对于较大规模的数据排序而言,显得有些笨重,所以学习一下比较高级的排序算法。
堆排序(基本思路)
堆排序的基本思路与之前的最大堆的创建和删除紧密联系,二者基本使用了同样的方法,将数据一一插入最大堆后依次输出。
时间复杂度:
最好情况:O(Nlog(N))
最坏情况:O(Nlog(N))
空间复杂度:O(1)
最大堆的创建插入和删除在之前的文章里已经有过介绍。
参考前面最大堆的文章
程序设计
依次将需要排序的数据插入到最大堆中,输入全部数据后,依次输出即为顺序排序好的数据。
最大堆的插入删除函数
//最大堆的插入
int Insert(struct tree T) {
int len;
length++;
len = length;
MaxHeap[length] = T;
if ((len / 2) == 0) {
return 0;
}
while (len) {
if (MaxHeap[len].data > MaxHeap[len / 2].data && len / 2!=0) {
MaxHeap[len].data = MaxHeap[len / 2].data;
len /= 2;
}
else {
break;
}
MaxHeap[len] = T;
}
MaxHeap[len] = T;
return 0;
}
//最大堆的删除
struct tree *Delete(void) {
int change;
int i;
//将最大堆开头的值取出保留
TE->data = MaxHeap[1].data;
TE->right = MaxHeap[1].right;
TE->left = MaxHeap[1].left;
//将尾端的数据放到开头
MaxHeap[1].data = MaxHeap[length].data;
//将尾端的数据置0
MaxHeap[length].data = 0;
length--;
//从第一层开始比较,
for (i = 1; i < length,2*i<length; ) {
if (MaxHeap[2 * i].data>MaxHeap[2 * i + 1].data) {
if (MaxHeap[i].data < MaxHeap[2 * i].data) {
change = MaxHeap[i].data;
MaxHeap[i].data = MaxHeap[2 * i].data;
MaxHeap[2 * i].data = change;
i *= 2;
}
else {
break;
}
}
else {
if (MaxHeap[i].data < MaxHeap[2 * i+1].data) {
change = MaxHeap[i].data;
MaxHeap[i].data = MaxHeap[2 * i+1].data;
MaxHeap[2 * i+1].data = change;
i *= 2;
i++;
}
else {
break;
}
}
}
return TE;
}
应用(对100000随机数进行排序,测试时间为0.02s)
int main() {
int i, n = 100000;
int list[100000];
struct tree T;
TE = malloc(sizeof(LEN_TREE));
clock_t start, finish;
double duration;
for (i = 0; i < n; i++) {
list[i] = rand();
}
//for (i = 1; i <= 100000; i++) {
// T.data = i;
// Insert(T);
//}
printf("\n");
start = clock();
for (i = 1; i <= 100000; i++) {
T.data = list[i - 1];
Insert(T);
}
for (i = 1; length; i++) {
//printf("->%d", Delete()->data);
list[i - 1]=Delete()->data;
}
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf("%f seconds\n", duration);
//makehuffman();
while (1);
return 0;
}
情况比快速排序时间稍差些,但是比常规的基础排序20s以上时间上还是快了非常多的