三种最简单的排序算法(直接插入排序、冒泡排序、简单选择排序)

来源:互联网 发布:单片机中断编写歌曲 编辑:程序博客网 时间:2024/05/22 06:39

一、直接插入排序(稳定)

直接插入排序是最简单的排序方法之一,其基本思想是每次从无序表中取出一个元素,把它插入到有序表的合适位置,使有序表依然有序。直接插入排序是由两层嵌套循环组成的,外层循环标识并决定待比较的数值,内层循环为待比较数值确定其最终位置,其算法时间复杂度为O(N*N),空间复杂度为O(1)。

void insertSort(int a[], int len)  //本文默认排序为从小到大排序{      int i,j,temp;      for (i = 1; i < len; i++) //外层循环标识待排序的数值      {          temp = a[i]; //保存第i个需要插入的数值        for(j = i - 1; j >= 0 && a[j] > temp; j--)  //内层循环决定插入的位置(这个位置一定在0到i-1之间)            a[j+1] = a[j];  //元素后移以提供插入空间        a[j+1] = temp;  //查找到位置之后插入数据    }        }  

二、冒泡排序(稳定)

冒泡排序同样是最简单的排序方法之一,并且常被用来寻找数组中最值。冒泡排序算法运作如下:1、比较相邻的元素,如果第一个比第二个大,就交换他们两个;2、对每一对相邻元素做同样的工作,从开始第一对到结尾最后一对。一次遍历之后,最后的元素应该会是最大的数;3、针对所有元素重复以上的步骤,除了最后一个;4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。该算法的时间复杂度为O(N*N),空间复杂度为O(1)。

void swap(int & a, int & b)  //交换两个数比较好的一种方式,可免疫越界问题{      a = a ^ b;      b = a ^ b;      a = a ^ b;  }  void bubbleSort(int arr[], int len)  {      int i,j,exchange;      exchange = 0;  //标记    for (i = 0; i < len - 1; i++)      {          for (j = 0; j < len - i - 1; j++)  //随着趟数的增加,需要比较的次数越来越少        {              if (arr[j] > arr[j+1])          {                  swap(arr[j],arr[j+1]);                  exchange = 1;              }          }          //如果没交换元素,说明已排好序          if (!exchange)          {              break;          }      }  }  

三、简单选择排序(不稳定)

简单选择排序的思路很简单,将最小元素找出并放在序列的最前面,在剩下的元素中继续找出最小的元素放在第二个位置上,依次类推,每次选出一个元素即可确定其在有序序列中的最终位置,简单选择排序的时间复杂度为O(N*N),空间复杂度为O(1)。

void selectSort(int arr[], int len)  {      int i,j,temp;      for (i = 0; i < len - 1; i++)      {          temp = i;  //记录最小元素的位置        for (j = i + 1; j < len; j++)  //每一趟在后面的n-i+1个待排序的元素中选择关键字最小的元素        {              if (arr[j] < arr[temp])              {                  temp = j;               }          }          if (temp != i)  //temp=i则表示已经在最终位置上,不需交换        {              swap(arr[temp],arr[i]);  //参考冒泡排序中的交换算法        }      }            }

最后对排序算法的稳定性予以总结:若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生改变,则称这种排序方法是不稳定的。
要注意的是,排序算法的稳定性是针对所有输入实例而言的。即在所有可能的输入实例中,只要有一个实例使得算法不满足稳定性要求,则该排序算法就是不稳定的。