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


一 冒泡排序

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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值