Re:从零开始的算法学习【5】阶段总结一

对三种简单排序法(冒泡,选择,快速)及二分法查找进行总结分析:

一、排序法

算法 冒泡排序 选择排序 快速排序
时间复杂度 O(n²) O(n²) O(n log n )

冒泡排序(BubbleSort)基本思想:依次比较相邻的两个数,将小数排在前面,大数放在后面。

void BubbleSort(int *a,int n )
{
	for(int i = 0;i<n-1;i++)
	{
		for(int j = 0;j<n-1-i;j++)
		{
			if(a[j]>a[j+1])
			{
				int t = a[j];
				a[j] = a[j+1];
				a[j+1] = t;
			}
		}
	}
}

选择排序基本思想:每一趟从待排序的数列中找出最小的,放在排好序的数列的最后。

void SelectionSort(int *a,int n )
{
	for(int i = 0;i<n-1;i++)
	{
		for(int j = i + 1;j<n;j++)
		{
			if(a[i]>a[j])
			{
				int t = a[j];
				a[j] = a[i];
				a[i] = t;
			}
		}
	}
}

快速排序基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后对这两部分再进行快速排序(递归调用)。

void qsort(int *a,int start,int end)
{
	 if(start >= end) return;	//停止递归
	int i = start;
	int j = end;
	int key = a[i];		//基准位
	
	while(i<j)
	{
		while(i<j&&a[j]>=key)
		{
			j--;
		}
		a[i] = a[j];
		
		while(i<j&&a[i]<=key)
		{
			i++;
		}
		a[j] = a[i];
	}
	a[i] = key; //或者a[j] = key;
	qsort(a,start,i-1);	//递归调用,对左右两边进行快排 
	qsort(a,i+1,end); 
}

根据时间复杂度,冒泡&选择排序适用于小列表,快速排序适用于大列表

一般来说,选择排序优于冒泡排序(效率高约7倍)。

但若数组完全有序,冒泡内循环一次都不会执行(可检测整个数组是否已经有序),而选择排序每次还要和本身交换一次,此时冒泡效率高。(此情况极少)

二、二分查找

string search(int a[],int num)
{
	int low = 0;
	int high = sizeof(a)-1;
	while(low <= high)
	{
	int mid = (low + high)/2;
	int guess = a[mid];
	if(guess == num )
	{
		return  "找到了";
	}
	if(guess > num)
	{
		high = mid - 1;
	}else{
		low = mid +1;
	}
	
	}
	return "没有找到";
}

时间复杂度O(log n)

注意:所查找的元素列表必须有序

扫描二维码关注公众号,回复: 188035 查看本文章


猜你喜欢

转载自blog.csdn.net/VinceMar/article/details/80242156