/************************************************************************************************************************
文件说明:
交换类排序
【1】冒泡排序
【2】快速排序
*************************************************************************************************************************/
#include<iostream>
using namespace std;
/************************************************************************************************************************
函数原型:
【函数模板】template<typename ElemType>static void BubbleSort(ElemType arrayT[],int iLength)
函数说明:
【1】对记录数组arrayT做【冒泡排序】
【2】iLength为数组中待排序记录的数目
交换排序:
【1】交换排序算法:就是根据序列中两个关键字的比较结果来对换这两个记录在序列中的位置。
【2】基于交换的排序算法有很多,一般主要掌握【冒泡排序】和【快速排序】
冒泡排序:
【1】冒泡排序算法的基本思想是:假设待排序表长为n,从后往前(或者从前往后)亮亮进行比较相邻元素的值,若为逆序,则交换,
知道序列比较完成。我们称它为一趟冒泡,结果将最小的元素交换在序列的第一个位置。
【2】这样每一趟冒泡排序可以确定一个元素的位置,如果待排序的记录有N个记录,则只需要N-1趟的排序
*************************************************************************************************************************/
template<typename ElemType>static void BubbleSort(ElemType arrayT[],int iLength)
{
for(int i=0;i<(iLength-1);i++) //【1】外循环控制排序的循环的次数,N个数,需要进行N-1趟的比较
{
for(int j=i;j<(iLength-1);j++) //【2】每趟需要比较的次数
{
if(arrayT[i]>arrayT[j])
{
int iTemp = arrayT[i];
arrayT[i] = arrayT[j];
arrayT[j] = iTemp;
}//if
}
}//for i
}
/************************************************************************************************************************
函数原型:
【函数模板】template<typename ElemType>ElemType QuickSort(ElemType arrayT[],int iLeft,int iRight)
函数说明:
对记录数组arrayT中的arrayT[iLeft]至arrayT[iRight]部分进行一趟快速排序,并得到基准的位置
快速排序:
快速排序是对冒泡排序的一种改进。其基本思想是基于【分治法】的:
【1】在待排序表L[1...n]中任取一个元素pivot作为 作为基准,通过一趟排序,将待排序表划分为两部分L[1....k-1]和
L[k+1.....n],是的前部分子表中的所有元素都小于pivot,后半部分的所有元素都大于pivot,则pivot放在了最终的位置
上L(k),这个过程放称作一趟【快速排序】。
【2】而后,分别递归的对两个子表重复上述过程,直至每部分内只有一个元素或者为空为止,即所有的元素均放在了最终的位
置上。
*************************************************************************************************************************/
template<typename ElemType>ElemType QuickKPass(ElemType arrayT[],int iLeft,int iRight)
{
ElemType pivotT = arrayT[iLeft]; //【1】选择一个基准的记录
int iLow = iLeft;
int iHigh = iRight;
while(iLow<iHigh)
{
while(iLow<iHigh&&pivotT<=arrayT[iHigh])
iHigh--;
if(iLow<iHigh)
{
arrayT[iLow]=arrayT[iHigh];
iLow++;
}
while (iLow<iHigh&&pivotT>arrayT[iLow])
{
iLow++;
}
if(iLow<iHigh)
{
arrayT[iHigh]=arrayT[iLow];
iHigh--;
}
}//while
arrayT[iLow] = pivotT;
return iLow;
}
template<typename ElemType>static void QuickSort(ElemType arrayT[],int iLow,int iHigh)
{
if(iLow<iHigh)
{
int iPos = QuickKPass<int>(arrayT,iLow,iHigh);
QuickSort(arrayT,iLow,iPos-1);
QuickSort(arrayT,iPos+1,iHigh);
}
}
/************************************************************************************************************************
模块说明:
控制台应用程序的入口点
*************************************************************************************************************************/
int main(int argc,char* argv[])
{
int arrayT[15] = {22,32,44,34,56,21,24,345,213,234,245,127,113,119,933};
//BubbleSort<int>(arrayT,15);
QuickSort<int>(arrayT,0,14);
for(int i=0;i<15;i++)
{
std::cout<<arrayT[i]<<std::endl;
}
std::system("pause");
return 0;
}
【Data_Structure笔记4】排序算法之【交换类排序】
最新推荐文章于 2024-07-09 08:00:00 发布