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——插入排序的思想:
从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中从后向前扫描
如果该元素(已排序)大于新元素,将该元素移到下一位置,
重复步骤,直到找到已排序的元素小于或者等于新元素的位置
将新元素插入到该位置后