前言
This Series aritcles are all based on the book 《经典算法大全》; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行实现; 目的是熟悉常用算法过程中的技巧和逻辑拓展。
提出问题
33.AlgorithmGossip:选择、插入、气泡排序
分析和解释
三个基础排序,复杂度都是O(n^2); 有了非常多的多余比较;详情同样维基百科解释得非常详细。
代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10
#define SWAP(x,y) {int t; t = x; x = y; y = t;}
void selsort(int[]); // 选择排序
void insort(int[]); // 插入排序
void bubsort(int[]); // 气泡排序
int main(void) {
int number[MAX] = {0};
int i;
srand(time(NULL));
printf("排序前:");
for(i = 0; i < MAX;i++){
number[i] = rand()% 100;
printf("%d ", number[i]);
}
printf("
请选择排序方式:
");
printf("(1)选择排序
(2)插入排序
(3)气泡排序
:");
scanf("%d", &i);
switch(i) {
case 1:
selsort(number);break;
case 2:
insort(number);break;
case 3:
bubsort(number);break;
default:
printf("选项错误(1..3)
");
}
return 0;
}
void selsort(int number[]) {
int i, j, k, m;
for(i = 0; i < MAX-1;i++) {
m = i;
for(j = i+1;j < MAX;j++)
if(number[j] < number[m])
m = j;
if( i != m)
SWAP(number[i],number[m])
printf("第 %d 次排序: ", i+1);
for(k = 0; k < MAX;k++)
printf("%d ", number[k]);
printf("
");
}
}
void insort(int number[]) {
int i, j, k, tmp;
for(j = 1; j < MAX;j++){
tmp = number[j];
i = j - 1;
while(tmp < number[i]) {
number[i+1] = number[i];
i--;
if(i == -1)
break;
}
number[i+1] = tmp;
printf("第 %d 次排序: ", j);
for(k = 0; k < MAX;k++)
printf("%d ", number[k]);
printf("
");
}
}
void bubsort(intnumber[]) {
int i, j, k, flag = 1;
for(i = 0; i < MAX-1 && flag == 1; i++){
flag = 0;
for(j = 0; j < MAX-i-1;j++) {
if(number[j+1] < number[j]) {
SWAP(number[j+1],number[j]);
flag = 1;
}
}
printf("第 %d 次排序: ", i+1);
for(k = 0; k < MAX;k++)
printf("%d ", number[k]);
printf("
");
}
}
拓展和关联
后面还有很多种排序算法, 可以从复杂度稳定性等方面进行考察和比较, 属于基础算法结构的内容。
后记
参考书籍
- 《经典算法大全》
- 维基百科