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

一、选择排序思路:
1、以 int 类型为例
2、拿第一个数与后面数相比较,如果比后面的数大则交换
3、拿第二个数与后面的数比较,如果比后面的数大则交换
4、直到比较到倒数第二个数,最后一个数不用比较
5、两个数比较可以用中间变量替换或者位运算
6、利用位运算时需注意,如果两个数相等则不能使用位运算
7、函数代码如下:
void SelectSort(int array[], size_t size)
{
	size_t i, j;
	for (i=0; ii; 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 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
四、冒泡排序和快速排序比较:
1、选择排序不稳定,时间复杂度为 O(n2)
2、冒泡排序稳定,时间复杂度为 O(n2)
3、快速排序不稳定,时间复杂度为 O(nlogn)
4、对于 100000 个随机数排序,选择排序约 20s,冒泡排序约 60s,快排约 0.02s
5、代码如下:
/*************************************************************************
  > File Name: sort.c
  > Author: Wenfei6316
  > Mail: [email protected] 
  > Created Time: 2018年06月16日 星期六 11时34分48秒
 ************************************************************************/

#include 
#include 
#include 
#include 

#define LEN	100000


//选择排序
void SelectSort(int array[], size_t size)
{
	size_t i, j;
	for (i=0; ii; 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 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
     6、运行结果如下:

排序——选择排序、冒泡排序和快速排序比较_第1张图片






你可能感兴趣的:(C语言,嵌入式面试题)