`

C#中几种排序的方法

    博客分类:
  • .Net
阅读更多
一,冒泡排序
/// <summary>
  /// bubbleSort;
  ///       
  /// /*理解其实程序就是思路的复述而已*/
  /// </summary>
  /// <param name="desti">目标数组</param>
  /// <param name="swapTimes">交换次数</param>
  public static void BubleSort(ref int[] desti, ref int swapTimes)
  {
   int destiLen = desti.Length;
   /******各重循环各行其是即可********/
   //冒泡次数,因为最后一次已经是最小,所以destiLen - 1
   for(int i = 0; i < destiLen - 1; i ++)
   {
    bool ins = true;
    //各次冒泡;前面已冒泡元素的位置无需冒泡;
    for(int j = 0; j < destiLen - i - 1; j ++)
    {
     if(desti[j] > desti[j + 1])
     {
      ins = false;
      Swap.Swaper(ref desti[j], ref desti[j + 1]);
      swapTimes ++;
     }
    }
    if(ins)
     break;
   }
  }
二,插入排序
/// <summary>
  /// 原始插入排序
  /// </summary>
  /// <param name="dest">目标数组</param>
  /// <param name="swapTimes">交换次数</param>
  public static void InsertSort(ref int[] dest, ref int swapTimes)
  {
   //其实根本没必要一个dest.length数组,使得空间复杂度增大
   //只需一个int零时变量即可,当前要排序的元素腾出即可
   ArrayList destArray = new ArrayList();
   destArray.Add(dest[0]);
   for(int i = 1; i < dest.Length; i ++)
   {
    bool ins = false;
    for(int j = 0; j <= i - 1; j ++)
    {
     if(dest[i] < (int)destArray[j])
     {
      ins = true;
      swapTimes ++;
      destArray.Insert(j, dest[i]);
      break;
     }
    }
    if(! ins)
     destArray.Insert(i, dest[i]);
   }
   for(int i = 0; i < dest.Length; i ++)
   {
    dest[i] = (int)destArray[i];
   }
  }
三,shell排序
/// <summary>
  /// shell sort
  /// </summary>
  /// <param name="dest">待排序数组</param>
  /// <param name="swapTimes">移动元素次数</param>
  public static void ShellSort(ref int[] dest, ref int swapTimes)
  {
   for(int delta = dest.Length / 2; delta >= 0; delta /= 2)
   {
    if(delta == 0)
     break;
    else
    {
     for(int i = 0; i < delta; i ++)
     {
      for(int j = i; j < dest.Length; j += delta)
      {
       int temp = dest[j];
       int tmp = j;
       while(tmp >= delta && temp < dest[tmp - delta])
       {
        dest[tmp] = dest[tmp - delta];
        swapTimes ++;
        tmp -= delta;
       }
       dest[tmp] = temp;
     
      }
     }
    }
 
   }
  }
四,快速排序
public static void QuickSort(ref int[] dest, int beg, int end, ref int swapTimes)
  {
   if(beg >= end)
    return;
   int pivot = (beg + end) / 2;
   Swap.Swaper(ref dest[pivot], ref dest[end]);
   int pivo = Partition(ref dest, beg, end, ref swapTimes);
  
   QuickSort(ref dest, beg, pivo - 1, ref swapTimes);
   QuickSort(ref dest, pivo + 1, end, ref swapTimes);
  }

  private static int Partition(ref int[] dest, int be, int en, ref int swapTimes)
  {
   int temp = dest[en];
   int b = be;
   int e = en;
   while(b != e)
   {
    while(dest[b] < temp && b < e)
     b ++;
    if(b < e)
    {
     dest[e] = dest[b];
     e --;
     swapTimes ++;
    }
    while(dest[e] > temp && b < e)
    {
     e --;
    }
    if(b < e)
    {
     dest[b] =  dest[e];
     b ++;
     swapTimes ++;
    }
   }
   dest[b] = temp;
   return b;
  }

五,两路归并排序
/// <summary>
  /// 对目标数组进行归并排序
  /// 与QuickSort的分治比较,感受递归
  /// </summary>
  /// <param name="dest">目标数组</param>
  /// <param name="tempDest">暂存数组</param>
  /// <param name="left">当前部分左位置</param>
  /// <param name="right">当前部分右位置</param>
  /// <param name="swapTimes">当前部分中间位置</param>
  public static void TwoWayMergeSort(int[] dest, int[] tempDest, int left, int right, ref int swapTimes)
  {
   if(left < right)
   {
    int mid = (left + right) / 2;
    //分割通过递归实现
    TwoWayMergeSort(dest, tempDest, left, mid, ref swapTimes);//左一半
    TwoWayMergeSort(dest, tempDest, mid + 1, right, ref swapTimes);//右一半
    Merge(dest, tempDest, left, right, mid, ref swapTimes);//对左右各半进行归并
   }
  }
 
  /// <summary>
  /// 对当前部分进行归并
  /// </summary>
  /// <param name="dest"></param>
  /// <param name="tempDest"></param>
  /// <param name="left"></param>
  /// <param name="right"></param>
  /// <param name="mid"></param>
  /// <param name="swapTimes">逆置位置</param>
  private static void Merge(int[] dest, int[] tempDest, int left, int right, int mid, ref int swapTimes)
  {
   for(int i = left; i <= right; i ++)
    tempDest[i] = dest[i];
   int index1 = left;
   int index2 = mid + 1;
   int index = left;//用left很重要,如若是0则会对dest的位置重复赋值
   //|-------|--------|
   // ^index1 ^index2,体现了归并的妙
   while(index1 <= mid && index2 <= right) 
   {
    if(tempDest[index1] <= tempDest[index2])
    {
     dest[index ++] = tempDest[index1 ++];
    }
    else
    {
     dest[index ++] = tempDest[index2 ++];
     swapTimes ++;
    }
   }
 
   while(index2 <= right)
   {
    dest[index ++] = tempDest[index2 ++];
   }
   while(index1 <= mid)
   {
    dest[index ++] = tempDest[index1 ++];
   }
  }
 
分享到:
评论

相关推荐

    c#实现几种排序算法,并输出关键字比较次数和交换次数

    每种排序算法都有其适用场景,理解它们的工作原理和性能特点对于优化代码和解决实际问题至关重要。在C#中实现这些排序算法,并统计关键字比较次数和交换次数,有助于程序员更好地评估算法效率,选择最合适的排序方法...

    C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序

    以下是对标题和描述中提到的几种排序算法的详细解析: 1. **插入排序**(Insertion Sort): - 插入排序是一种简单直观的排序算法,它的工作原理类似于打扑克牌。将数组分为已排序区和未排序区,每次从未排序区...

    C#排序算法(C#)

    本文将深入探讨C#语言中常见的几种排序算法,包括它们的工作原理、性能特点以及如何在C#代码中实现。 1. **冒泡排序**: 冒泡排序是一种简单的排序算法,通过重复遍历数组,比较相邻元素并交换位置来完成排序。在...

    C#的几个排序算法

    本文将详细介绍几种基本的排序算法:冒泡排序、选择排序、插入排序和希尔排序,并通过具体的代码示例来解析每种算法的工作原理及其在C#中的实现。 ### 1. 冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法,...

    C#四种排序算法 算法最牛逼

    在C#中,我们通常会遇到几种经典的排序算法,包括冒泡排序、插入排序、选择排序以及快速排序。下面将详细阐述这四种排序算法的原理、实现方式以及它们各自的优缺点。 1. 冒泡排序(Bubble Sort) 冒泡排序是最简单...

    c#的算法 选择排序 冒泡排序 快速排序 插入排序 。。。

    根据给定的信息,本文将详细解释C#中的几种基本排序算法:选择排序、冒泡排序、快速排序、插入排序、希尔排序以及归并排序的基本原理和实现方式。 ### 一、选择排序(Selection Sort) #### 算法原理 选择排序是一...

    C#的几种排序法介绍了“冒泡”,“选择”,等

    根据给定的文件信息,我们可以深入探讨几种在C#中实现的基本排序算法,包括冒泡排序、选择排序、插入排序以及希尔排序。这些算法在数据结构与算法领域中占有重要地位,是理解排序机制和算法复杂度分析的基础。 ### ...

    C# 各种排序算法实现与对比

    本文将详细讲解C#中实现的几种常见排序算法,并对它们的执行效率进行对比。 1. **冒泡排序(Bubble Sort)** 冒泡排序是一种简单的排序方法,通过重复遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把...

    基于c#算法的几种排序(冒泡,快速等)

    本资源主要关注C#语言实现的几种常见排序算法,包括冒泡排序和快速排序。下面将详细阐述这两种排序算法的工作原理、优缺点以及如何使用C#来实现它们。 **冒泡排序(Bubble Sort)** 冒泡排序是一种简单直观的排序...

    C#必须要知道的排序算法Demo

    根据给定的信息,本文将详细介绍几种在C#中实现的基本排序算法,包括快速排序、冒泡排序、选择排序以及插入排序。这些算法是每一位初学者都需要掌握的基础技能,通过理解和实践这些排序方法,可以帮助程序员更好地...

    C# 图 拓扑排序

    拓扑排序是对有向无环图(DAG,Directed Acyclic Graph)的一种排序方法,它将图中的节点排成一个线性的序列,使得对于每一条从节点u到节点v的有向边(u, v),u都在v之前出现。在C#中实现拓扑排序,我们需要理解几个...

    C#排序算法大全

    本文将深入探讨C#中的几种常见排序算法,包括它们的基本原理、实现方式以及适用场景。 1. 冒泡排序(Bubble Sort) 冒泡排序是最简单的排序算法之一,通过重复遍历数组,比较相邻元素并交换顺序(如果需要)来完成...

    C#实现所有经典排序算法

    根据给定的信息,本文将详细解释C#语言中几种经典的排序算法实现方法,包括选择排序(Selection Sort)、冒泡排序(Bubble Sort)、快速排序(Quick Sort)以及插入排序(Insertion Sort)。这些算法是计算机科学中...

    c#实现各种排序算法动态演示

    归并排序在C#中可以使用递归方法和额外的存储空间来实现。 6. **希尔排序**:希尔排序是插入排序的一种更高效的改进版本,也称为缩小增量排序。它通过比较相距一定间隔的元素,然后交换它们,逐步减少间隔,直到...

    C#快速排序算法

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它基于分治策略,通过选取一个基准值,将数组分为两部分,一部分的所有元素都小于基准值,另一部分的所有元素都大于或等于基准值,然后...

    c#产生随机数并冒泡排序

    本文介绍了C#中生成随机数的方法、数组的基本操作以及冒泡排序算法的具体实现。通过这个示例程序,读者可以了解到如何在实际编程中应用这些概念。值得注意的是,虽然冒泡排序易于理解和实现,但在大数据量的情况下...

    c#实现基本排序算法

    本文将详细探讨C#语言中实现的几种基本排序算法,包括冒泡排序、鸡尾酒排序(双向冒泡)、选择排序、插入排序、希尔排序、堆排序和归并排序。 首先,我们来看**冒泡排序**,它是最简单的排序算法之一。通过不断交换...

    C#插入排序C#代码.

    综上所述,这些代码示例为我们展示了如何在C#中实现插入排序算法,并且演示了如何将排序结果输出到控制台上。插入排序虽然不是最高效的排序算法,但在处理小规模数据或部分有序的数据时,其性能表现还是非常不错的。

    c# winform EasyListViewSorter ListView排序 带箭头 例子 源码 数字 字符串 排序

    为了实现点击列头进行排序的功能,我们需要在ListView的`ColumnClick`事件中调用ListView的`Sort`方法,并传入EasyListViewSorter实例。每次点击列头时,都需要检查当前的排序字段是否与新点击的列相同,以便更新...

Global site tag (gtag.js) - Google Analytics