actanble

导航

AlgorithmGossip (33) 选择、插入、气泡排序

前言

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("\n请选择排序方式:\n");
	printf("(1)选择排序\n(2)插入排序\n(3)气泡排序\n:");
	scanf("%d", &i);
	switch(i) {
		case 1:
		selsort(number);break;
		case 2:
		insort(number);break;
		case 3:
		bubsort(number);break;
		default:
		printf("选项错误(1..3)\n");
		}
	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("\n");
		}
	}
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("\n");
		}
	}
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("\n");
		}
	}

拓展和关联

后面还有很多种排序算法, 可以从复杂度稳定性等方面进行考察和比较, 属于基础算法结构的内容。

后记

参考书籍

  • 《经典算法大全》
  • 维基百科

posted on 2017-04-14 21:30  白于空  阅读(118)  评论(0编辑  收藏  举报