使用合并排序和快速排序对字符串按长度排序

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

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;
}
}

时间: 2024-12-23 05:47:19

使用合并排序和快速排序对字符串按长度排序的相关文章

【Java学习笔记】&lt;集合框架&gt;对字符串进行长度排序

1 package 测试; 2 3 import java.util.Comparator; 4 5 public class ComparatorByLength implements Comparator { //定义比较器 6 7 @Override 8 public int compare(Object o1, Object o2) { 9 String s1 = (String)o1; 10 String s2 = (String)o2; 11 12 int temp = s1.len

练习:要对字符串进行长度(由短到长)排序。

/** * 字符串由短到长的排序 * 思路: * 1.排序,想到TreeSet集合,因为字符串扔到TreeSet集合中,能自动排序. * 2.字符串排序,是因为字符串本身具备自然排序的功能. * 3.但是依靠的是它的自然排序是字母由小到大排序,所以只能用比较器定义长度排序 * 4.而且TreeSet直接能在构造方法中传入比较器. * 5.输出结果. */ public class TreeSetTest { public static void main(String[] args) { Set

【Oracle】【29】根据字段的长度排序

正文: select * from student s order by nvl(length(trim(s.sname)),0) asc -- nvl(attribute, default value) 当属性值为空时就将其值设默认值 -- length(attrbute) 得到字符串的长度 -- trim(attribute) 去掉字符的空格 参考博客: Oracle ==>SQL 查询根据字符串的长度排序_清水绿草_新浪博客http://blog.sina.com.cn/s/blog_45

递归与分治-合并排序、快速排序以及循环赛问题

合并排序 合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 递归方法: 基本思想是:将待排序元素分成大小一致相同的2个子集和,分别对两个子集和进行排序,最终将排好序的子集合并成所需要的排好序的集合 package com.gqx.arithmetic.Recursion; public class Recursion_Merge2 { private static void mergeSort(

合并排序和快速排序

/* 合并排序 O(n*lgn) */ #include <iostream> using namespace std; #define MAXN 100 int a[MAXN]; void Merge(int a[MAXN],int left,int mid,int right) { int i,j,k; int n1=mid-left+1; int n2=right-mid; int L[MAXN],R[MAXN]; for(i=1;i<=n1;i++) L[i]=a[left+i-

算法有插入排序,堆排序,合并排序,快速排序和stooge排序

比较的算法有插入排序,堆排序,合并排序,快速排序和stooge排序, 先说一下比较结果 1,比较插入和stooge排序,stooge的表现如此之差,数组大小在2000时 InsertSort VS StoogeSort 's Running Time:     16ms:47672ms; Terribly! Isn't It? 所以在后面的比较中,没有带stooge这个垃圾算法 2,插入排序,堆排序,合并排序,快速排序运行时间对比 (网易博客的表格功能太差了,不爽,只好以文本对齐展现给大家了):

如何优化合并排序和快速排序

和并排序和快速排序在元素的重复率特别高的时候排序的时间变长.我们可以利用三向切分的办法来避免相同的元素进行交换,以减少交换次数. 具体如下图所示: 总共有3个指针,lt,i,和gt,这个三个指针分别指着队首,队首的下一位,队尾.以队首为参考点,设该数组为a.设中间变量temp. temp ← a[lt] //队首设为参考变量 if a[i] < temp:           swap(a,lt++,i++) else if a[i] > temp:           swap(a,i,j-

php 实现冒泡算法排序、快速排序、选择排序,插入排序

许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的.下面是我按自己的理解,将四个方法分析一遍. 需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序.  $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序法   *     思路分析:法如其名,就是像冒

单向链表排序:快速排序和归并排序

归并排序改变链接 快速排序改变链接 快速排序改变节点值 所有源码和测试函数 对单向链表的排序有2种形式,只改变节点的值 和 只改变链接 // 节点 struct ListNode { int val; ListNode* next; ListNode(int v, ListNode* n = NULL) { val = v; next = n; } }; 本文链接:单向链表排序:快速排序和归并排序 参考资料链接: 链表排序(冒泡.选择.插入.快排.归并.希尔.堆排序): 1. 归并排序(改变链接