> 文档中心 > c++排序算法(快速排序、冒泡排序、选择排序)

c++排序算法(快速排序、冒泡排序、选择排序)

1——快速排序,这里的容器是全局的,不全局的话,可以在参数那里加个数组的参数传进来。

从大到小:

//从大到小排序void ResManage::quickSortLastUpdateTime(const int iLeftIndex, const int iRightIndex){    int iTempElement = m_qlTempRes.value(iLeftIndex).iLastUpdateTime; //暂存基准数    int iTempLeftIndex = iLeftIndex;//最左位置    int iTempRightIndex = iRightIndex;//最右位置    if(iLeftIndex > iRightIndex) //递归结束条件    { return;    }    while (iTempLeftIndex != iTempRightIndex) //当iTempLeft和iTempRight不重合时    { while(m_qlTempRes.value(iTempRightIndex).iLastUpdateTime <= iTempElement&& iTempLeftIndex = iTempElement&& iTempLeftIndex < iTempRightIndex)//从左往右寻找小于基准数的值 {     iTempLeftIndex++; }if(iTempLeftIndex < iTempRightIndex) {     //找到了且i<j则交换数值     m_qlTempRes.swap(iTempLeftIndex,iTempRightIndex); }    }    //将基准数和iTempLeftIndex、iTempRightIndex的相遇数值进行交换    if(iLeftIndex != iTempLeftIndex)    { m_qlTempRes.swap(iLeftIndex,iTempLeftIndex);    }    //应用递归对此时基准数的左边进行快速排序    quickSortLastUpdateTime(iLeftIndex,iTempLeftIndex-1);    //应用递归对此时基准数的右边进行快速排序    quickSortLastUpdateTime(iTempLeftIndex+1,iRightIndex);}

原理:从序列的两端开始
(1)首先将最左边的数值作为基准数,应用2个变量iTempLeftIndex和iTempRightIndex

分别指向序列左端和右端;
(2)首先从iTempLeftIndex左往右寻找一个小于基准数的数,iTempRightIndex从右往左寻找一个大于2的数;

如果是从小到大的排序,就从左边往右找大于基数的数,从右边往左找小于基数的数。为什么这样,大家换个角度想想我们最后是要交换iTempLeftIndex、iTempRightIndex的值就可以想通了。
(3)找到了之后进行第一次交换,继续搜索;
(5)当iTempLeftIndex和iTempRightIndex都到了同一个位置后,表明第一轮交换结束,将基准数和iTempLeftIndex上的值进行交换,此时以iTempLeftIndex位置为分界线,左边的值都是大于iTempLeftIndex位置上的值,右边的值都是小于iTempLeftIndex上的值。

(6)最后调用递归分别处理左边序列和右边序列即可。

2——冒泡排序:从小打大

算法的思想:其实就是把每个值都和数组里面的值进行一遍比较(相邻位置)。

比如第一次循环:第一个值依次和后面值进行比较,比较完之后,最后一个位置的值一定是最大的。

第二次循环:第一个值依次和后面n-1个值进行比较,同理,比较完换值之后,倒数第二个位置的值是第二大的。

依次这样即可。

void bubbleSort(int a[], int n){    for(int i =0 ; i< n-1; ++i)    { for(int j = 0; j  a[j+1])//从大到小的话,这里换成小于就可以了     {  int tmp = a[j] ; //交换  a[j] = a[j+1] ;  a[j+1] = tmp;     } }    }}

3——选择排序

void selestSort(int a[],int n){    int iMinIdex=0;//假设这个位置上的值就是最小的    int temp;    for(int i=0;i<n;i++)    { iMinIdex = i; for(int j=i+1;j<n;j++) {     if(a[j] < a[iMinIdex])     {  iMinIdex = j;     } } temp = a[iMinIdex]; a[iMinIdex] = a[i]; a[i] = temp;    }}

思想:分成两列,未排序和已排序,第一次选出最小或最大的值放在排序的一边,下次在未排序的队列中找出最小或最大的值放入已排序的一边,如此循环即可。

4——插入排序的思想:

从第一个元素开始,该元素可以认为已经被排序

取出下一个元素,在已经排序的元素序列中从后向前扫描

如果该元素(已排序)大于新元素,将该元素移到下一位置,

重复步骤,直到找到已排序的元素小于或者等于新元素的位置

将新元素插入到该位置后