zoukankan      html  css  js  c++  java
  • 使用合并排序和快速排序对字符串按长度排序

    前段时间要对字符串集合进行按长度排序,字符串长度长的排在队列前面,最短的排在最后,可以使用两种排序方法进行排序,其中快速排序的效能会好些,但快速排序在字符串的集合非常大的时候,有时会得不到正确的结果,具体原因还不清楚。

    1.合拼排序的代码

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace FtpproxyDownRule.DBUtility
    {
    
        public class sortbyStringLength
        {
            /// <summary>
            /// 使用合并排序
            /// </summary>
            /// <param name="orderstrings">待排序的集合</param>
            public static void Mergesort(string[] orderstrings)
            {
                long arraylength = orderstrings.LongLength;
                if (arraylength > 1)
                {
                    //把集合分成两半,分别进行排序
                    long length = long.Parse(Convert.ToString(Math.Ceiling(orderstrings.LongLength / 2D)));
    
                    string[] firstArray = new string[length];
                    string[] secondArray = new string[arraylength - length];
                    //把orderstrings前半部分复制到firstArray中
                    copyArray(orderstrings, firstArray, true);
                    //把orderstrings后半部分复制到secondArray中
                    copyArray(orderstrings, secondArray, false);
                    //递归调用,对firstArray分成两部分
                    Mergesort(firstArray);
                    Mergesort(secondArray);
                    //合并排序后的结果
                    merge(firstArray, secondArray, orderstrings);
                }
            }
            /// <summary>
            /// 对两个集合进行排序
            /// </summary>
            /// <param name="firstArray">待排序的集合</param>
            /// <param name="secondArray">待排序的集合</param>
            /// <param name="OriginalArray">firstArray,secondArray进行排序后得到的集合</param>
            private static void merge(string[] firstArray, string[] secondArray, string[] OriginalArray)
            {
                long firstArraylength = firstArray.LongLength;
                long secondArraylength = secondArray.LongLength;
    
                long i = 0, j = 0, k = 0;
                while (i < firstArraylength && j < secondArraylength)
                {
                    if (firstArray[i].Length > secondArray[j].Length)
                    {
                        OriginalArray[k] = firstArray[i];
                        i++;
                    }
                    else
                    {
                        OriginalArray[k] = secondArray[j];
                        j++;
                    }
                    k++;
                }
                if (i == firstArraylength)
                {
                    copyArray(secondArray, OriginalArray, j, k);
                }
                else
                {
                    copyArray(firstArray, OriginalArray, i, k);
                }
    
            }
            private static void copyArray(string[] OriginalArray, string[] firstArray, bool flag)
            {
                long OriginalLength = OriginalArray.LongLength;
                long count = long.Parse(Convert.ToString(Math.Ceiling(OriginalLength / 2D)));
                if (flag)
                {
                    for (int i = 0; i < count; i++)
                    {
    
                        firstArray[i] = OriginalArray[i];
    
                    }
                }
                else
                {
                    long j = 0;
                    for (long i = count; i < OriginalLength; i++)
                    {
                        firstArray[j] = OriginalArray[i];
                        j++;
                    }
                }
    
            }
            private static void copyArray(string[] OriginalArray, string[] firstArray, long OriginalArraybenginIndex, long FirstArraybenginIndex)
            {
    
                long OriginalArrayLenth = OriginalArray.LongLength;
                for (long i = OriginalArraybenginIndex; i < OriginalArrayLenth; i++)
                {
                    firstArray[FirstArraybenginIndex] = OriginalArray[i];
                    FirstArraybenginIndex++;
                }
    
            }
        }
    
    }

    快速排序的代码:

        class quickSortbyStringLenth
        {
            public static void QuickSort(string[] orderstring)
            {
                Qsort(orderstring, 0, orderstring.LongLength - 1);
            }
            private static void Qsort(string[] orderstrings, long lowindex, long highindex)
            {
                if (lowindex < highindex)
                {
                    long pivotloc = Partition(orderstrings, lowindex, highindex);
                    Qsort(orderstrings, lowindex, pivotloc - 1);
                    Qsort(orderstrings, pivotloc + 1, highindex);
                }
            }
            private static long Partition(string[] OriginalArray, long lowIndex, long highIndex)
            {
                //OriginalArray[0] = OriginalArray[lowIndex];
                string p = OriginalArray[lowIndex];
                while (lowIndex < highIndex)
                {
                    while (lowIndex < highIndex && OriginalArray[highIndex].Length <= p.Length) --highIndex;
                    OriginalArray[lowIndex] = OriginalArray[highIndex];
                    while (lowIndex < highIndex && OriginalArray[lowIndex].Length >= p.Length) ++lowIndex;
                    OriginalArray[highIndex] = OriginalArray[lowIndex];
                }
                OriginalArray[lowIndex] = p;
                return lowIndex;
            }
        }
  • 相关阅读:
    读取INI配置文件
    在VB编程中,若一行代码太长需要换行时,行尾要加什么符号
    使用order by和group by的分析
    转 Sqlserver_left join 、right join、 inner join 用法
    Python 字典(Dictionary)操作详解
    转sql server新增、修改字段语句(整理)
    Winform TextBox中只能输入数字的几种常用方法(C#)
    数据库的范式,第一、二、三、四、五范式、BC范式
    【操作系统】银行家算法
    转 图解排序算法(三)之堆排序
  • 原文地址:https://www.cnblogs.com/goxmpx/p/3761676.html
Copyright © 2011-2022 走看看