您的位置:首页 > 职场人生

[黑马程序员]05[c 语言]常见排序算法的时间复杂度比较

2015-04-15 01:14 399 查看
-------
android培训、java培训IOS培训、期待与您交流! ----------

前言:

不同于面向对象的Objective-C, C语言是面向过程的, C语言往往能涉及到计较基层的东西,而我们也不可避免地会遇到

很多C语言的算法设计题,而算法设计里,最基本的就是遍历查找算法,作为一个合格的编程者,应该了解多种算法的基本

查找思想,时间复杂度,从而设计出运行效率更高效的程序.我们的本职是Objective-C开发,因此暂时不做太深的了解,仅

讨论下几种常见排序算法的思想,写法以及时间复杂度.

正文:

冒泡排序:

//
冒泡排序思想:
//
是两两相邻的元素进行比较,然后将较大的(或较小的)放到后面,慢慢的将大的元素依次后放
//
第一步是将最大的元素(或最小的元素)放到最后
// 第二步在剩下的元素中继续完成这个操作

冒泡算法代码;

#include
<stdio.h>

void bubbleSort(int *array,int length)
{
for(int i =
0; i < length -1; i++) {

for(int j =
0; j < length -1 - i; j++){

if(array[j] >array[j+1]) {

//交换

int temp =array[j];
array[j] =array[j +1];
array[j+1] =temp;
}
}
}
}

冒泡算法的比较次数为(length-1)+(length-2)+…..1=(length-1)*length/2,因此其时间复杂度为o(n^2).

选择排序

//选择排序思想:
//使用一个循环,遍历数组,将一个最小或最大的元素放到一个固定的位置
//排除这个已确定的位置,其他的数组元素做新一轮的遍历,按照同样的规律确定第二//个位置的值
//直到处理到最后一位,排序完成

选择排序算法代码:

void selectSort(int *array,int length)
{
for(int j =
0; j < length -1; j++) {

for(int i = j +
1; i < length;i++) {

if(nums[j] <nums[i]) {

int temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
}
}
}
}

选择排序算法的比较次数为(length-1)+(length-2)+…..1=(length-1)*length/2,因此其时间复杂度为o(n^2).

快速排序

//快速排序法的思想:
//通过一趟排序将要排序的数据分割成两个独立的部分
//
选择一个标准数(中间)
//
经过一轮循环将小于这个数的数据放到左边,将大于这个数的数据放到右边
//
分别对这个两部分(这个两个部分就相当于两个另外的小数组(子数组))
//递推处理,直到排序完成

快速排序算法代码:

void sort(int *a, int left, int right)
{
if(left >= right) //如果左边的数组大于或者等于就代表已经整理完成一个组了
return ;
int i = left;
int j = right;
int key = a[left];
while(i < j) //控制在当组内寻找一遍
{
while(i < j && key <= a[j]) //而寻找结束的条件就是,1,找到一个小余或者大于key的数(大小取决于你想升序还是降序)2,没有符合的切i与j相遇
{
j --; //向前寻找
}
a[i] = a[j]; //找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是a[0],那么就是给key)
while(i < j && key >= a[i]) //这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反
{
i ++;
}
a[j] = a[i];
}
a[i] = key; //当在当组内找完一遍以后就把中间数key回归
sort(a,left,i - 1); //最后用同样的方式对分出来的左边的小组进行同上的做法
sort(a,i + 1,right); //用同样的方式对分出来的右边的小组进行同上的做法
//当然最后可能会出现很多分左右,直到每一组的i = j 为止
}

快速排序理想情况时间复杂度为o(nlong2 n),最差o(n^2)

二分查找排序

//
二分查找算法思想:
//
等同于查字典
//
一开始,根据规律(一半)找一个页面,将这个页面中的汉字与想要查找的字比较
//
看这个字应该在前面还是后面
//
在前,向前查找;在后,向后查找

//
为什么可以这么找?
//
如果想从一个数组中,找到某个数据
// 1)数组乱序,一个个找(遍历)
//2)数组有序,二分法查找(折半查找)

二分查找算法代码:

int erFenSort(int *array,int length,int search)
{
int lower =0;
int higher =length -1;
int mid;
while (lower <=higher) {

//首先计算中间数字
mid = (lower +higher)/2;

if (search ==array[mid]) {

//找到了

return mid;

break;
}else
if(search >array[mid]){

//去右边找
lower = mid+1;
}else{
higher =mid-1;
}
}
//判断是否找到
return -1;
}

二分查找的最优nlong2 n,最差o(n^2)

在我们的通常性程序算法设计,一般掌握冒泡和二分查找法就足够了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: