排序算法——C#语言版

插入排序:(直接插入排序&希尔排序)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Sort

{

public class InsertSort

{

public static int k;

/// <summary>

/// 直接插入排序

/// </summary>

/// <param name="a">数组</param>

/// <param name="n">数组的长度</param>

public static void DirectInsertSort(int[] a, int n)

{

for (int i = 0; i < n; i++)

{

int t = a[i];

for (int j = i - 1; j >= 0; j--)

{

if (t < a[j])

{

a[j + 1] = a[j];

a[j] = t;

}

else

{

break;

}

k++;

}

k++;

}

}

/// <summary>

/// 希尔排序

/// 希尔排序是将数组按照一定增量分为几组,然后对每组进行直接插入排序

/// 增量按照(n/2,n/4,...)以此递减,最后以增量为1进行最后排序,

/// 而直接插入排序就是直接将增量设置为1的希尔排序

/// </summary>

/// <param name="a">数组</param>

/// <param name="n">数组长度</param>

public static void ShellInsertSort(int[] a, int n)

{

for (double d = Math.Floor((double)(n / 2)); d >= 1; d = Math.Floor(d / 2))

{

ShellSort(a, n, (int)d);

k++;

}

}

/// <summary>

/// 按照增量d进行快速插入排序

/// </summary>

/// <param name="a">数组</param>

/// <param name="n">数组长度</param>

/// <param name="d">增量</param>

public static void ShellSort(int[] a, int n, int d)

{

for (int m = 0; m < d; m++)

{

for (int i = d + m; i < n; i = i + d)

{

int t = a[i];

for (int j = i - d; j >= 0; j = j - d)

{

if (t < a[j])

{

a[j + d] = a[j];

a[j] = t;

}

k++;

}

k++;

}

k++;

}

}

}

}

交换排序(冒泡排序&快速排序)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Sort

{

public class ExchangeSort

{

public static int k = 0;

/// <summary>

/// 冒泡排序

/// </summary>

/// <param name="a">数组</param>

/// <param name="n">数组长度</param>

public static void BubbleSort(int[] a, int n)

{

for (int m = 1; m <= n; m++)

{

int j = 0;

for (int i = 0; i < n - m; i++)

{

if (a[i] > a[i + 1])

{

int t = a[i];

a[i] = a[i + 1];

a[i + 1] = t;

j++;

}

k++;//计数

}

k++;

if (j == 0)

break; //如果J等于0,则表示在这一趟排序中,没有进行数据交换,则说明已经排好序列

}

}

/// <summary>

/// 快速排序

/// </summary>

/// <param name="a">数组</param>

/// <param name="n">数组长度</param>

public static void QuickSort(int[] a, int n)

{

QSort(a, 0, n - 1);

}

/// <summary>

/// 递归进行快速排序

/// </summary>

/// <param name="a">数组</param>

/// <param name="low">最低索引号</param>

/// <param name="high">最高索引号</param>

public static void QSort(int[] a, int low, int high)

{

if (low < high)

{

int i = low;

int j = high;

int t = a[i];

while (i < j)

{

while (i < j && a[j] >= t)

{

j--;

k++; //计数

}

a[i] = a[j];

while (i < j && a[i] <= t)

{

i++;

k++;

}

a[j] = a[i];

k++;

}

if (i == j)

{

a[i] = t;

QSort(a, low, i - 1);

QSort(a, i + 1, high);

}

}

}

}

}

选择排序(简单选择排序&堆排序)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Sort

{

public class SelectionSort

{

public static int k = 0;

/// <summary>

/// 简单选择排序

/// </summary>

/// <param name="a">数组</param>

/// <param name="n">数组长度</param>

public static void SimpleSelectionSort(int[] a, int n)

{

for (int i = 0; i < n; i++)

{

int t = a[i];

for (int j = i + 1; j < n; j++)

{

if (a[j] < t)

{

a[i] = a[j];

a[j] = t;

t = a[i];

}

k++;

}

k++;

}

}

/// <summary>

/// 堆排序

/// 第一步:建立堆

/// 第二步:将建立好的堆的第一个数取出放到最后一位,然后对前面重新建立堆,然后再取出第一个最大数

/// </summary>

/// <param name="a"></param>

/// <param name="m"></param>

public static void HeapSort(int[] a, int n)

{

for (int j = n; j > 1; j--)

{

for (int i = j / 2 - 1; i >= 0; i--)

{

CreateHeap(a, i, j - 1);

}

int t = a[0];

a[0] = a[j - 1];

a[j - 1] = t;

k++;

}

}

/// <summary>

/// 建立堆(大顶堆)

/// </summary>

/// <param name="a">数组</param>

/// <param name="low">数组的起始结点索引</param>

/// <param name="high">数组的最大索引</param>

public static void CreateHeap(int[] a, int low, int high)

{

int i = low;

int j = 2 * i + 1;

int t = a[i];

while (j <= high)

{

k++;

if (j + 1 <= high && a[j] < a[j + 1])//左孩子小于右孩子

{

j++;//指向右孩子

}

if (a[i] < a[j])

{

a[i] = a[j];

a[j] = t;

i = j;//以交换后的孩子结点为根节点,继续进行创建堆

j = 2 * i + 1;

}

else

{

break;

}

}

}

}

}

归并排序

主程序:

private static int k = 0;
static void Main(string[] args)
{
int[] a = new int[17] { 18, 15, 14,100, 13, 3, 4, 5, 10, 2, 7, 21, 9, 8, 23, 54, 30 };
Print(a);
//Console.WriteLine("直接插入排序:");
//InsertSort.DirectInsertSort(a, a.Length);
////ShellSort(a, a.Length, 1);
//Print(a);
//Console.WriteLine("直接插入排序需要 {0} 次计算。", InsertSort.k);

//Console.WriteLine("希尔排序:");
//InsertSort.ShellInsertSort(a, a.Length);
//Print(a);
//Console.WriteLine("希尔排序需要 {0} 次计算。", InsertSort.k);

//Console.WriteLine("冒泡排序:");
//ExchangeSort.BubbleSort(a, a.Length);
//Print(a);
//Console.WriteLine("冒泡排序需要 {0} 次计算。", ExchangeSort.k);

//Console.WriteLine("快速排序:");
//ExchangeSort.QuickSort(a, a.Length);
//Print(a);
//Console.WriteLine("快速排序需要 {0} 次计算。", ExchangeSort.k);

//Console.WriteLine("简单选择排序:");
//SelectionSort.SimpleSelectionSort(a, a.Length);
//Print(a);
//Console.WriteLine("简单选择排序需要 {0} 次计算。", SelectionSort.k);

Console.WriteLine("堆排序:");
SelectionSort.HeapSort(a, a.Length);
Print(a);
Console.WriteLine("堆排序需要 {0} 次计算。", SelectionSort.k);              

Console.ReadLine();

}

时间: 2024-10-02 14:01:00

排序算法——C#语言版的相关文章

六种排序算法C语言版(上)

排序即将一个无序的数组(序列)按照一定的规则排列,常见的规则便是按照从大到小或者从小到大的顺序.本文讨论的排序一律指按照从小到大的顺序进行排列的这种情况. 本文将分为上下两章介绍以下六种排序算法: (1)直接选择排序 (2)冒泡排序 (3)快速排序 (4)二分排序 (5)堆排序 (6)线性时间排序. 首先,直接选择排序.直接选择排序的思想是: 1.第一次从数组A[0]到A[n-1]中选出最小的然后与A[0]进行交换: 2.第二次从A[1]到A[n-1]中选择最小的然后与A[1]进行交换: 依次类

经典排序算法(Java版)

经典排序算法(Java版)  转载 1.冒泡排序 Bubble Sort最简单的排序方法是冒泡排序方法.这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮.在冒泡排序算法中我们要对这个“气泡”序列处理若干遍.所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确.如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置.显然,处理一遍之后,“最轻”的元素就浮到了最高位置:处理二遍之后,“次轻”的元素就浮到了次高位

可视化对比十多种排序算法(C#版)

本文由 伯乐在线 - smilesisi 翻译自 Kanasz Robert.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. 在这篇文章中,我会向大家展示一些排序算法的可视化过程.我还写了一个工具,大家可对比查看某两种排序算法. 下载源码 – 75.7 KB 下载示例 – 27.1 KB 引言 首先,我认为是最重要的是要理解什么是“排序算法”.根据维基百科,排序算法(Sorting algorithm)是一种能将一串数据依照特定排序方式进行排列的一种算法.最常用到的排序方式是数值顺序以及字典

常见排序算法(JS版)

常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>twobin 常见排序算法 (JS版) </title> 5 <meta http-equiv="content-type" content=&

程序员必须掌握的8大排序算法(Java版)

程序员必须掌握的8大排序算法(Java版) 提交 我的评论 加载中 已评论 程序员必须掌握的8大排序算法(Java版) 2015-07-28 极客学院 极客学院 极客学院 微信号 jikexueyuan00 功能介绍 极客学院官方帐号,最新课程.活动发布.欢迎大家反馈问题哟^_^ 本文由网络资料整理而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空

3203 数组做函数参数----排序函数--C语言版

3203: 数组做函数参数----排序函数--C语言版 时间限制: 1 Sec  内存限制: 128 MB提交: 253  解决: 151[提交][状态][讨论版][命题人:smallgyy] 题目描述 定义一个函数来完成对参数数组中元素的排序工作,函数声明如下: void sort(int array[ ]);//该函数完成对array数组的排序工作 在以下程序的基础上,完成对sort函数的定义,提交时,只提交sort函数的定义即可. #include <stdio.h> void sort

快速排序算法C语言版

快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过

十大经典排序算法的JS版

排序对比: 排序对比.jpg 排序分类: 排序分类.jpg 冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法,它重复的走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来,走访数列的工作是重复的进行直到没有再需要交换,也就是说数列已经排序完成,这个算法的名字的由来是因为越小的元素会精油交换慢慢浮到数列的顶端. 1.初级版 function bubbleSort(array) { const length = array.length; for (let i =

数据结构之常见的排序算法c语言实现

常见的简单排序算法有冒泡排序.选择排序.插入排序.快排.堆排序.归并排序.希尔排序等,这些排序的理论在网上有很多,这就只给出常见的排序算法源码,上学时候写的,不足之处欢迎大家指正. 下面几种排序的主函数入口为:     int main(int argc, char* argv[])         {      int i, len;      int a[] = {8,5,6,4,9,10,3,15,2,17};           len = (sizeof(a) / sizeof(a[0