排序——选择排序、冒泡排序和快速排序比较

一、选择排序思路:
1、以 int 类型为例
2、拿第一个数与后面数相比较,如果比后面的数大则交换
3、拿第二个数与后面的数比较,如果比后面的数大则交换
4、直到比较到倒数第二个数,最后一个数不用比较
5、两个数比较可以用中间变量替换或者位运算
6、利用位运算时需注意,如果两个数相等则不能使用位运算
7、函数代码如下:
void SelectSort(int array[], size_t size)
{
	size_t i, j;
	for (i=0; i<size-1; i++)
		for (j=size-1; j>i; j--)
			if (array[i] > array[j])
			{
				array[i] = array[i] ^ array[j];
				array[j] = array[i] ^ array[j];
				array[i] = array[i] ^ array[j];
			}
}

二、冒泡排序思路:

1、以 int 类型为例
2、每轮依次比较相邻两个数的大小,后面比前面小则交换
3、代码如下:
void RubbleSort(int array[], size_t size)
{
	size_t i, j;
	for (i=0; i<size-1; i++)
		for (j=0; j<size-1-i; j++)
			if (array[j] > array[j+1])
			{
				array[j]   = array[j] ^ array[j+1];
				array[j+1] = array[j] ^ array[j+1];
				array[j]   = array[j] ^ array[j+1];
			}
}
三、快速排序思路:
1、以 int 类型为例
2、选择第一个数为基点,右边 j 开始查找比基点小的数停止,再从左边 i 查找比基点数大的数停住
3、调换 i、j 对应的数后执行步骤 2,知道 i 和 j 相遇,此时 i == j
4、调换 i 对应的数和基点数,将源数列一分为 2 后分别重复步骤 2、3、4,知道结束
5、注意使用位运算调换时必须判断交换两个数不能相等,否则第二个数为 0
6、函数代码如下:
void QuickSort(int array[], int left, int right)
{
	if (left >= right)
		return;
	int i, j;
	int tmp;
	i = left;
	j = right;

	while (i < j)
	{
		while (array[j]>=array[left] && i<j)
			j--;
		while (array[i]<=array[left] && i<j)
			i++;

		tmp = array[i];
		array[i] = array[j];
		array[j] = tmp;
	}
	
	tmp = array[left];
	array[left] = array[i];
	array[i] = tmp;

	QuickSort(array, left, i-1);
	QuickSort(array, i+1, right);
}
四、冒泡排序和快速排序比较:
1、选择排序不稳定,时间复杂度为 O(n2)
2、冒泡排序稳定,时间复杂度为 O(n2)
3、快速排序不稳定,时间复杂度为 O(nlogn)
4、对于 100000 个随机数排序,选择排序约 20s,冒泡排序约 60s,快排约 0.02s
5、代码如下:
/*************************************************************************
  > File Name: sort.c
  > Author: Wenfei6316
  > Mail: Wenfei6316@163.com 
  > Created Time: 2018年06月16日 星期六 11时34分48秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define LEN	100000


//选择排序
void SelectSort(int array[], size_t size)
{
	size_t i, j;
	for (i=0; i<size-1; i++)
		for (j=size-1; j>i; j--)
			if (array[i] > array[j])
			{
				array[i] = array[i] ^ array[j];
				array[j] = array[i] ^ array[j];
				array[i] = array[i] ^ array[j];
			}
}


//冒泡排序
void RubbleSort(int array[], size_t size)
{
	size_t i, j;
	for (i=0; i<size-1; i++)
		for (j=0; j<size-1-i; j++)
			if (array[j] > array[j+1])
			{
				array[j]   = array[j] ^ array[j+1];
				array[j+1] = array[j] ^ array[j+1];
				array[j]   = array[j] ^ array[j+1];
			}
}

//快速排序
void QuickSort(int array[], int left, int right)
{
	if (left >= right)
		return;
	int i, j;
	int tmp;
	i = left;
	j = right;

	while (i < j)
	{
		while (array[j]>=array[left] && i<j)
			j--;
		while (array[i]<=array[left] && i<j)
			i++;

		tmp = array[i];
		array[i] = array[j];
		array[j] = tmp;
	}
	
	tmp = array[left];
	array[left] = array[i];
	array[i] = tmp;

	QuickSort(array, left, i-1);
	QuickSort(array, i+1, right);
}

int main(int argc, const char *argv[])
{
	int i;
	clock_t start, end;
	int *a, *b, *c;
	a = (int *)malloc(sizeof(int)*LEN);
	if (a == NULL)
	{
		perror("Create a failed");
		return EXIT_FAILURE;
	}
	
	b = (int *)malloc(sizeof(int)*LEN);
	if (b == NULL)
	{
		perror("Create b failed");
		return EXIT_FAILURE;
	}
	c = (int *)malloc(sizeof(int)*LEN);
	if (c == NULL)
	{
		perror("Create c failed");
		return EXIT_FAILURE;
	}

	srand(time(NULL));
	for (i = 0; i<LEN; i++)
	{
		a[i] = rand() % 10000;
		c[i] = b[i] = a[i];
	}

	printf("a[100] = %d b[100] = %d c[100] = %d\n", a[100], b[100], c[100]);

	start = clock();
	SelectSort(a, LEN);
	end = clock();
	printf("end - start = %lf seconds\n", (double)(end-start)/CLOCKS_PER_SEC);

	start = clock();
	RubbleSort(b, LEN);
	end = clock();
	printf("end - start = %lf seconds\n", (double)(end-start)/CLOCKS_PER_SEC);

	start = clock();
	QuickSort(c, 0, LEN-1);
	end = clock();
	printf("end - start = %lf seconds\n", (double)(end-start)/CLOCKS_PER_SEC);

	printf("a[100] = %d b[100] = %d c[100] = %d\n", a[100], b[100], c[100]);
	
	return 0;
}
     6、运行结果如下:







  • 15
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值