冒泡排序、选择排序、快速排序

来源:互联网 发布:安徽铜陵网络台 编辑:程序博客网 时间:2024/06/04 18:36

一 冒泡排序

1.简介

冒泡排序,故名思议就像气泡漂上来一样,值比较小的在前,值比较大的在后。是一种较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误
就他们交换起来

2.原理

冒泡排序算法的运作如下:
a.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
b.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对
c.针对所有的元素重复以上的步骤,除了最后一个
d.持续每次对越来越少的元素重复以上的步骤,直到没有任何一对数字需要比较。

3.代码

 void maopao(int a[],int len){    int i,j,temp;    for(i = 0;i < len - 1 ; i ++){//从第一个到倒数第二个      for (j = 0 ; j < len - 1 - i ; j ++)//排在后的是已经排序的      {        if (a[j] > a[j + 1])//大的数换到后面去        {          temp = a[j];          a[j] = a[j + 1];          a [j + 1] = temp;        }      }    }  } 

4.时间复杂度和空间复杂度

时间复杂度是O(n^2),空间复杂度是O(1)。

二、选择排序

1.简介

选择排序是一种不稳定的排序方法,每趟从待排序的数据元素中选出最小或者最大的一个元素,顺序放在已排好序的数列的最后。直到全部待排序的数据元素排完

2.原理

对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面
“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),等
到循环结束的时候,我们应该找到了最小的那个数的下标了,然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟
他交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。

3.代码

 void xuanze(int a[],int len){    int i , j , t , temp;    for (i = 0 ; i < len - 1 ;i ++)    {      t = i;      for (j = i + 1 ; j < len ; j ++)//前面的实排好的      {        if (a[t] > a[j])        {          t = j;//记下该趟最小数的序号        }      }      if (t != i)//如果序号不变就什么也不做      {        temp = a[t];//否则元素交换        a[t] = a[i];        a[i] = temp;      }    }  } 


4.时间复杂度和空间复杂度

时间复杂度为O(n^2),空间复杂度为O(1)。


三、快速排序

1.简介

快速排序(Quick Sort)是一种有效的排序算法。虽然算法在最坏的情况下运行时间为O(n^2),但由于平均运行时间为O(nlogn),并且在

内存使用、程序实现复杂性上表现优秀,尤其是对快速排序算法进行随机化的可能,使得快速排序在一般情况下是最实用的排序方法之一。

2.原理

快速排序的实现基于分治法,具体分为三个步骤。假设待排序的序列为L[m..n]。    分解:序列L[m .. n]被划分成两个可能为空的子序列L[m .. pivot-1]和L[pivot+1 .. n],使L[m .. pivot-1]的每个元素均小于或等于L[pivot],同时L[pivot+1.. n]的每个元素均大于L[pivot]。其中L[pivot]称为这一趟分割中的主元(也称为枢轴、支点)。    解决:通过递归调用快速排序,对子序列L[m .. pivot-1]和L[pivot+1 .. 

3.代码

void qSort(int a[], int low, int high){   int temp;   int mid = low;//定义一个中索引,用于记录一次排序后确定位置的一个元素索引   int right = high;//记录最右元素索引       //默认中值是左值,现在要把凡是比中值大的元素放到中值左边   while(right > mid){//因此从右开始向中值遍历,到达中值时遍历结束     if (a[right] < a[mid])//如果右值比中值还小,说明他不该在右边,要把它放到左边     {       temp = a[mid];//所以先把中值的地盘腾出来       a[mid] = a[right];//把比中值小的那个数放在那儿       //中值没地方放,必须右移移位,但是直接右移会覆盖原来他右边的那个值       a[right] = a[++mid];//不过right索引的空间已经腾出来了,就把中值原来右边的值放到right       a[mid] = temp;//然后就可以把mid右移一位     }     else{       right--;//否则的话说明right已然大于等于mid,不用移动,继续判断right左边那个数     }   }//这样right与mid重合之时,退出循环,此时mid的位置已经确定了就是排完序后他的位置    //因为他左边的都比他小,右边的都比他大   if (mid - low > 1)//如果low到mid之间还有两个或以上元素,还要对他们排序   {     qSort(a, low, mid - 1);   }     if (high - mid > 1)//右边那半也是一样   {     qSort(a, mid + 1, high);   } } 

4.时间复杂度和空间复杂度

快速排序的平均时间复杂度为O(nlogn),空间复杂度为O(1)。

0 0
原创粉丝点击