`
ganyu21
  • 浏览: 7359 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

白话经典算法系列之四 直接选择排序及交换二个数据的正确实现

阅读更多

直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。

 

设数组为a[0…n-1]

1.      初始时,数组全为无序区为a[0..n-1]。令i=0

2.      在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交换。交换之后a[0…i]就形成了一个有序区。

3.      i++并重复第二步直到i==n-1。排序完成。

 

直接选择排序无疑是最容易实现的,下面给出代码:

void Selectsort(int a[], int n)
{
       int i, j, nMinIndex;
       for (i = 0; i < n; i++)
       {
              nMinIndex = i; //找最小元素的位置
              for (j = i + 1; j < n; j++)
                     if (a[j] < a[nMinIndex])
                            nMinIndex = j;
 
              Swap(a[i], a[nMinIndex]); //将这个元素放到无序区的开头
       }
}
 

 

在这里,要特别提醒各位注意下Swap()的实现,建议用:

inline void Swap(int &a, int &b)
{
       int c = a;
       a = b;
       b = c;
}
 

笔试面试时考不用中间数据交换二个数,很多人给出了

inline void Swap1(int &a, int &b)
{
       a ^= b;
       b ^= a;
       a ^= b;
}
 

在网上搜索下,也可以找到许多这样的写法。不过这样写存在一个隐患,如果a, b指向的是同一个数,那么调用Swap1()函数会使这个数为0。如:

       int i = 6;

       Swap1(ii);

       printf("%d\n"i);

当然谁都不会在程序中这样的写代码,但回到我们的Selectsort(),如果a[0]就是最小的数,那么在交换时,将会出现将a[0]0的情况,这种错误相信调试起来也很难发现吧,因此建议大家将交换二数的函数写成:

inline void Swap(int &a, int &b)
{
       int c = a;
       a = b;
       b = c;
}
 

或者在Swap1()中加个判断,如果二个数据相等就不用交换了:

inline void Swap1(int &a, int &b)
{
       if (a != b)
       {
              a ^= b;
              b ^= a;
              a ^= b;
       }
}
 

 

分享到:
评论

相关推荐

    MoreWindows白话经典算法之七大排序第2版(高清)

    本书《更多Windows白话经典算法之七大排序第2版》是一部深入浅出讲解七种经典排序算法的著作,旨在帮助读者理解并掌握冒泡排序、直接插入排序、直接选择排序、希尔排序、归并排序、快速排序以及堆排序等基本概念和...

    MoreWindows白话经典算法之七大排序(高清版)

    ### 白话经典算法之七大排序 #### 一、冒泡排序 冒泡排序是一种简单直观的排序算法,它的基本思想是从第一个元素开始,比较相邻元素的大小,如果前一个元素大于后一个元素则交换它们的位置,这样一轮比较下来,...

    白话经典算法之七大排序

    冒泡排序是最简单的排序算法之一,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的...

    白话经典算法之七大排序(高清版)

    《白话经典算法之七大排序》是一本专为初学者设计的算法教程,旨在通过简单易懂的语言,帮助读者深入浅出地理解并掌握七大排序算法。这些排序算法是计算机科学与信息技术领域的基础,对于提升编程能力和解决实际问题...

    白话经典算法系列之六 快速排序 快速搞定 - MoreWindows - 博客园1

    快速排序是一种高效的排序算法,由C.R.A.Hoare在1962年提出。它基于分治策略,但其完整流程可以更准确地描述为“挖坑填数+分治法”。快速排序的核心思想是通过选取一个基准数,将数组分为两部分:一部分的所有元素都...

    MoreWindows白话经典算法之七大排序

    冒泡排序、插入排序、选择排序、希尔排序、归并排序、快速排序和堆排序是七大基础的计算机算法,它们各自有着不同的特点和适用场景。 一、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地遍历要...

    More Windows白话经典数据结构算法之七大排序最新整理版

    **优化 2:** 记录最后一次交换的位置,因为该位置之后的数据已经是有序的,所以下一次排序时只需遍历到这个位置即可。 **示例代码:** ```c++ // 冒泡排序 3 void BubbleSort3(int a[], int n) { int flag = n; ...

    经典算法之七大排序白话讲解第二版

    根据给定文件的信息,本文将深入探讨七大经典排序算法,并结合具体的实现方法,帮助读者更好地理解每种排序算法的工作原理及适用场景。 ### 盒子一:直接选择排序 直接选择排序是一种简单直观的排序算法。它的工作...

    白话经典算法

    本文将详细解析七种经典的排序算法:冒泡排序、直接插入排序、直接选择排序、希尔排序、归并排序、快速排序以及堆排序。这些算法对于程序员来说至关重要,无论是在日常开发还是在面试中,都是常被问及的知识点。 1....

    排序算法经典讲解

    本资源"MoreWindows白话经典算法之七大排序(高清版).pdf"提供了一套详尽的排序算法讲解,涵盖了七大经典的排序算法。以下是这些排序算法的详细介绍: 1. 冒泡排序(Bubble Sort): 冒泡排序是一种简单的交换排序,...

    白话的排序总结

    ### 白话的排序总结——七大排序方法详解 #### 一、冒泡排序 冒泡排序是最基础也是最容易理解的一种排序方法。它通过不断地比较相邻的两个元素,并根据需要进行交换来达到排序的目的。 **基本步骤:** 1. **初始化...

    基本算法模块.doc

    - **插入排序**:直接插入排序在每次迭代中将一个元素插入到已排序的序列中,是稳定的排序算法,时间复杂度同样为O(n^2)。 - **冒泡排序**:冒泡排序通过不断交换相邻的逆序元素来逐步排序,它是稳定的排序算法,...

Global site tag (gtag.js) - Google Analytics