[黑马程序员]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)
在我们的通常性程序算法设计,一般掌握冒泡和二分查找法就足够了
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)
在我们的通常性程序算法设计,一般掌握冒泡和二分查找法就足够了
相关文章推荐
- 11. 常见的有哪几种排序算法,试比较其时间复杂度,以及是否稳定,及各自使用的情形
- 各种排序算法时间复杂度、稳定性、初始序列是否对元素比较次数有关
- 常见排序算法及对应的时间复杂度和空间复杂度
- 排序算法的时间复杂度比较(quick_sort;bubble_sort)
- 为什么基于比较的排序算法,时间复杂度总是大于等于nlgn
- 各种排序算法比较:时间复杂度,空间复杂度
- 各种排序算法时间复杂度、稳定性、初始序列是否对元素比较次数有关
- 各种排序算法的总结和比较以及时间复杂度
- 第二周项目3 体验复杂度(比较两种排序算法的运行时间)
- 排序算法时间复杂度、稳定性比较
- 几种常见的排序算法及其时间复杂度——选择排序(三)
- C++的STL库,vector sort排序时间复杂度 及常见容器比较
- 常见排序算法的时间复杂度、稳定性总结
- 排序问题:各种排序算法的时间复杂度 比较
- 常见排序算法的时间复杂度和空间复杂度对比表
- 常见排序算法的稳定性,时间复杂度,原地排序
- 各种排序算法比较:时间复杂度,空间复杂度
- 第二章 数据结构和算法(常见的时间复杂度及比较)
- 常见排序算法以及对应的时间复杂度和空间复杂度
- 排序算法时间复杂度、空间复杂度、稳定性比较