交换排序:冒泡排序,快速排序

来源:互联网 发布:松下剃须刀哪款好 知乎 编辑:程序博客网 时间:2024/06/06 21:38

 

   该算法来源于[数据结构(C语言版)].严蔚敏_吴伟民.,这里根据自己需要换成了c#语言,有的不清楚,是在百度百科搜索后整理了一下,记录下来的,

   数组从[0..n-1]进行排序的

   测试数据:int[] array = { 49, 38, 65, 97, 76, 13, 27, 49 };

1.冒泡排序

    /// <summary>    /// 冒泡排序(没有判断是否完成排序),最简单的,最原始的    /// </summary>    public void BubbleSort0(int[] array)    {        int r0;        for(int i=0;i<array.Length;i++)            for (int j = 1; j < array.Length; j++)            {                if (array[j - 1] > array[j])                {                    r0 = array[j-1];                    array[j - 1] = array[j];                    array[j] = r0;                }            }    }

2.冒泡排序改进:

       在排序过程中,执行完最后的排序后,虽然数据已全部排序完备,但程序无法判断是否完成排序,为了解决这一不足,可设置一个标志位flag,将其初始值设置为非0,表示被排序的表是一个无序的表,每一次排序开始前设置flag值为0,在进行数据交换时,修改flag为非0。在新一轮排序开始时,检查此标志,若此标志为0,表示上一次没有做过交换数据,则结束排序;否则进行排序;

    /// <summary>    /// 冒泡排序(结果逆序:大的在上面,小的在下面)    /// </summary>    public void BubbleSort1(int[] array)    {        bool isExchanged = false;        int i, j, temp;
        for (i = 0; i < array.Length - 1; i++)        {            isExchanged = false;            for (j = array.Length - 1; j > i; j--) //j > i             {                if (array[j] > array[j - 1])                {                    temp = array[j];                    array[j] = array[j - 1];                    array[j - 1] = temp;                    isExchanged = true;                }            }            if (!isExchanged)//一遍比较过后如果没有进行交换则退出循环                break;        }     }
 
 
    /// <summary>    /// 冒泡排序(结果顺序:小的在上面,大的在下面)    /// </summary>    public void BubbleSort2(int[] array)    {        bool isExchanged = false;        int i, j, temp;        for (i = 0; i < array.Length; i++)        {            isExchanged = false;            for (j = 0; j < array.Length - i - 1; j++) //array.Length - i - 1 进行n-i-1趟            {                if (array[j + 1] < array[j])                {                    temp = array[j + 1];                    array[j + 1] = array[j];                    array[j] = temp;                    isExchanged = true;                }            }            if (!isExchanged)//一遍比较过后如果没有进行交换则退出循环                break;        }    }

2.快速排序

    /// <summary>    ///快速排序    ///算法介绍:    /// 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,    /// 所有比它大的数都放到它后面,这个过程称为一趟快速排序。    /// 值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。    /// 一趟快速排序的算法是:    /// 1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;     /// 2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];     /// 3)从j开始向前搜索,即由后开始向前搜索(j -- ),找到第一个小于key的值A[j],A[i]与A[j]交换;    /// 4)从i开始向后搜索,即由前开始向后搜索(i ++ ),找到第一个大于key的A[i],A[i]与A[j]交换;    /// 5)重复第3、4、5步,直到 i=j; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后令循环结束。)    ///     /// </summary>    public void QuickSort(int[] R, int low, int high)    {   //对R[low..high]快速排序        int pivotpos; //划分后的基准记录的位置        if (low < high)        {//仅当区间长度大于1时才须排序            pivotpos = Partition(R, low, high); //对R[low..high]做划分            QuickSort(R, low, pivotpos - 1);    //对左区间递归排序            QuickSort(R, pivotpos + 1, high);   //对右区间递归排序        }    }     /// <summary>    /// 对R[low..high]做划分,并返回基准记录的位置    /// </summary>    /// <returns></returns>    int Partition(int[] R, int i, int j)    {        int pivot = R[i]; //用区间的第1个记录作为基准 '        while (i < j)        {   //从区间两端交替向中间扫描,直至i=j为止            while (i < j && R[j] >= pivot) //pivot相当于在位置i上                j--;   //从右向左扫描,查找第1个关键字小于pivot.key的记录R[j]            if (i < j) //表示找到的R[j]的关键字<pivot.key                R[i++] = R[j]; //相当于交换R[i]和R[j],交换后i指针加1            while (i < j && R[i] <= pivot) //pivot相当于在位置j上                i++;   //从左向右扫描,查找第1个关键字大于pivot.key的记录R[i]            if (i < j) //表示找到了R[i],使R[i].key>pivot.key                R[j--] = R[i]; //相当于交换R[i]和R[j],交换后j指针减1
        }        R[i] = pivot; //基准记录已被最后定位        return i;    }

 3.快速排序,取中间值作为基准,这个是在网上瞅见的

    /// <summary>    /// 快速排序:取中间的元素作为比较基准,小于他的往左边移,大于他的往右边移    /// </summary>    /// <param name="array">待排序数组</param>    /// <param name="left">数组第一个元素索引Index</param>    /// <param name="right">数组最后一个元素索引Index</param>    public void QuickSort1(int[] array, int left, int right)    {        //左边索引小于右边,则还未排序完成        if (left < right)        {            //取中间的元素作为比较基准,小于他的往左边移,大于他的往右边移            int middle = array[(left + right) / 2];            int i = left - 1;            int j = right + 1;            while (true)            {                while (array[++i] < middle && i < right) ;                while (array[--j] > middle && j > 0) ;                if (i >= j)                    break;                Swap(array, i, j);            }            QuickSort1(array, left, i - 1);            QuickSort1(array, j + 1, right);        }    }    /// <summary>    /// 交换元素值    /// </summary>    /// <param name="array">数组</param>    /// <param name="i">当前左边索引</param>    /// <param name="j">当前右边索引</param>    private static void Swap(int[] array, int i, int j)    {        int temp = array[i];        array[i] = array[j];        array[j] = temp;    }