总结系列又来咯!c++常见的排序算法

今天主要给大家总结的是物联网类的教程,其他的教程会下期讲,其他学科视频教程可以评论回复我领取哈!记得回复学科名!

总结一下c++常见的排序算法,包括插入排序,快速排序、选择排序、双端选择排序、冒泡法排序等等。

总结系列又来咯!c++常见的排序算法

直接插入排序 InsertSort2(vector<int> &num)

整个序列分为有序区和无序区,取第一个元素作为初始有序区,然后第二个开始,依次插入到有序区的合适位置,直到排好序。插入排序是一种稳定的排序方法,排序元素比较少的时候很好,大量元素便会效率低下。

void InsertSort2(vector<int> &num){

    for(int i = 1;i < num.size();++i){

        for(int j = i;j > 0;--j){

            if(num[j] < num[j - 1]){

                int temp = num[j];

                num[j] = num[j-1];

                num[j-1] = temp;

            }

        }

    }}

选择排序法SelectionSort(int arr[],int n)

选择排序每扫描一遍数组,只需要一次真正的交换,而冒泡可能需要很多次。比较的次数一样的。

template <typename T>

void SelectionSort(T arr[],int n)

{

 int smallIndex;   //表中最小元素的下标

 int pass,j;       //用来扫描子表的下标

 T temp;           //用来交换表元素的临时变量

 //pass的范围是0~n-2

 for (pass=0;pass<n-1;pass++)

 {

  //从下标pass开始扫描子表

  smallIndex=pass;

  

  //j遍历整个子表arr[pass+1]到arr[n-1]

  for(j=pass+1;j<n;j++)

   //如果找到更小的元素,则将该位置赋值给smallIndex

   if(arr[j]<arr[smallIndex])

    smallIndex=j;

  //如果smallIndex和pass不在相同的位置

  //则将子表中的最小项与arr[pass]交换

  if(smallIndex!=pass)

  {

   temp=arr[pass];

   arr[pass]=arr[smallIndex];

   arr[smallIndex]=temp;

  }

 }

}

双端选择排序算法函数deSelSort()的实现

双端选择排序算法:选择排序算法的变种,可以定位每个子表中最小和最大元素并把它们分别放在子表的开头和结尾.

template <typename T>

void deSelSort(T arr[],int n)

{

 int smallIndex,largeIndex;  //表中最小及最大元素的下标

 int leftPass=0,rightPass=n-1,i,j;     //用来从表左边及右边扫描子表的下标

 T temp;                        //用于交换元素的临时变量

 

 while (leftPass<=rightPass)

 {

  //从左边及右边开始扫描子表

  smallIndex=leftPass;

  largeIndex=rightPass;

  

  //j和i遍历整个子表arr[LeftPass]~arr[rightPass]

  for (i=leftPass+1;i<rightPass;i++)

   //如果找到更小的元素,则将该位置赋值给smallIndex

   if (arr[i]<arr[smallIndex])

    smallIndex=i;

  //如果smallIndex和leftPass不在相同的位置

  //则将子表中的最小项与arr[pass]交换

  if (smallIndex!=leftPass)

  {

   temp=arr[leftPass];

   arr[leftPass]=arr[smallIndex];

   arr[smallIndex]=temp;

  }

 

  for (j=rightPass-1;j>leftPass;j--)

   if(arr[j]>arr[largeIndex])

    largeIndex=j;

  if(largeIndex!=rightPass)

  {

   temp=arr[rightPass];

   arr[rightPass]=arr[largeIndex];

   arr[largeIndex]=temp;

  }

  //从两头收缩子表

  leftPass++;

  rightPass--;

 }

}

自编冒泡法排序算法函数bubbleSort()的实现

比较相邻的元素,如果反序则交换,过程也是分为有序区和无序区,初始时有序区为空,所有元素都在无序区,经过第一趟后就能找出最大的元素,然后重复便可。冒泡排序也是一种稳定的排序算法,也是元素较少时效率比较高。

template <typename T>

int bubbleSort(T arr[],int n)

{

 bool exchanged=false; //是否发生交换

 int i,j;              //用于遍历子表的下标

T temp;               //用于交换元素的临时变量

 //开始遍历过程,以下标j构成子表,共有n-1个子表

 for (j=n-1;j>=0;j--) //j从后往前收缩n-1~0,以构成子表0~n-1,0~n-2,0~n-3..0~1

 {

  exchanged=false;

  for (i=0;i<j;i++) //遍历子表范围0~j

  {

   

   if (arr[i]>arr[i+1])

   {

    temp=arr[i];

    arr[i]=arr[i+1];

    arr[i+1]=temp;

    exchanged=true;

   }

  }

  if (!exchanged) return n-j-1;//如果在一次遍历中没有发生交换,则表示已经

                               //排序好,中断遍历过程

 }

 return n-1-j;

}

 

//冒泡法排序一般算法函数bubbleSortEx()的实现

 

template <typename T>

int bubbleSortEx(T arr[],int n)

{

 int i,pass;              //用于遍历子表的下标

 T temp;               //用于交换元素的临时变量

 //开始遍历过程,以下标j构成子表,共有n-1个子表

 for (pass=0;pass<n;pass++) //pass从后往后扩大0~n-1,以构成子表0~n-1,0~n-2,0~n-3..0~1

 {

  for (i=0;i<n-pass;i++) //遍历子表范围0~n-pass

  {   

   if (arr[i]>arr[i+1])

   {

    temp=arr[i];

    arr[i]=arr[i+1];

    arr[i+1]=temp;

   }

  }

 }

 return pass;

}

创作不易,记得支持一下哦!

其他的学科过段时间会再更新,回复:学科名,即可领取全套视频教程!总结不易,且学且珍惜!

发布了729 篇原创文章 · 获赞 191 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/chen801090/article/details/105687602
今日推荐