c# 自定义排序类(冒泡、选择、插入、希尔、快速、归并、堆排序等)
using System;
using System.Text; namespace HuaTong.General.Utility
{
/// <summary>
/// 自定义排序类
/// </summary>
public class Sorter
{
/// <summary>
/// 交换元素位置
/// </summary>
public static void Swap<T>(ref T[] arr, int i, int j)
{
T temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
} /// <summary>
/// 冒泡排序
/// </summary>
public static T[] BubbleSort<T>(T[] arr) where T : IComparable
{
for (int i = arr.Length - ; i > ; --i)
{
for (int j = ; j < i; ++j)
{
if (arr[j].CompareTo(arr[j + ]) > )
{
Swap(ref arr, j, j + );
}
}
}
return arr;
} /// <summary>
/// 选择排序
/// </summary>
public static T[] SelectionSort<T>(T[] arr) where T : IComparable
{
for (int i = ; i < arr.Length; ++i)
{
int index = i;
for (int j = i + ; j < arr.Length; ++j)
{
if (arr[j].CompareTo(arr[index]) < ) index = j;
}
Swap(ref arr, i, index);
}
return arr;
} /// <summary>
/// 插入排序
/// </summary>
public static T[] InsertionSort<T>(T[] arr) where T : IComparable
{
for (int i = ; i < arr.Length; ++i)
{
int j = i;
T value = arr[i];
while (j > && arr[j - ].CompareTo(value) > )
{
arr[j] = arr[j - ];
--j;
}
arr[j] = value;
}
return arr;
} /// <summary>
/// 希尔排序
/// </summary>
public static T[] ShellSort<T>(T[] arr) where T : IComparable
{
for (int step = arr.Length >> ; step > ; step >>= )
{
for (int i = ; i < step; ++i)
{
for (int j = i + step; j < arr.Length; j += step)
{
int k = j;
T value = arr[j];
while (k >= step && arr[k - step].CompareTo(value) > )
{
arr[k] = arr[k - step];
k -= step;
}
arr[k] = value;
}
}
}
return arr;
} /// <summary>
/// 快速排序
/// </summary>
public static T[] QuickSort<T>(T[] arr, int startIndex, int endIndex) where T : IComparable
{
int i, j;
T x, y; i = (startIndex < ? : startIndex);
j = (endIndex > arr.Length - ? arr.Length - : endIndex);
if (startIndex > endIndex) return null;
x = arr[(i + j) / ]; while (i <= j)
{
while (arr[i].CompareTo(x) < && i < endIndex)
{
i = i + ;
}
while (x.CompareTo(arr[j]) < && j > startIndex)
{
j = j - ;
}
if (i <= j)
{
y = arr[i];
arr[i] = arr[j];
arr[j] = y;
i = i + ;
j = j - ;
}
} if (startIndex < j) QuickSort(arr, startIndex, j);
if (i < endIndex) QuickSort(arr, i, endIndex); return arr;
} /// <summary>
/// 归并排序
/// </summary>
public static T[] MergeSort<T>(T[] arr, int startIndex, int endIndex, T[] arrF) where T : IComparable
{
startIndex = (startIndex < ? : startIndex);
endIndex = (endIndex > arr.Length - ? arr.Length - : endIndex);
arrF = new T[arr.Length];
if (startIndex >= endIndex) return null;
int m = (startIndex + endIndex) >> ;
MergeSort(arr, startIndex, m, arrF);
MergeSort(arr, m + , endIndex, arrF);
for (int i = startIndex, j = startIndex, k = m + ; i <= endIndex; ++i)
{
arrF[i] = arr[(k > endIndex || j <= m && arr[j].CompareTo(arr[k]) < ) ? j++ : k++];
}
for (int i = startIndex; i <= endIndex; ++i) arr[i] = arrF[i]; return arr;
} /// <summary>
/// 堆排序
/// </summary>
public static T[] HeapSort<T>(T[] arr) where T : IComparable
{
for (int i = ; i < arr.Length; ++i)
{
for (int j = i, k = (j - ) >> ; k >= ; j = k, k = (k - ) >> )
{
if (arr[k].CompareTo(arr[j]) >= ) break;
Swap(ref arr, j, k);
}
}
for (int i = arr.Length - ; i > ; --i)
{
Swap(ref arr, , i);
for (int j = , k = (j + ) << ; k <= i; j = k, k = (k + ) << )
{
if (k == i || arr[k].CompareTo(arr[k - ]) < ) --k;
if (arr[k].CompareTo(arr[j]) <= ) break;
Swap(ref arr, j, k);
}
}
return arr;
}
}
}
c# 自定义排序类(冒泡、选择、插入、希尔、快速、归并、堆排序等)的更多相关文章
- C++学习(三十八)(C语言部分)之 排序(冒泡 选择 插入 快排)
算法是解决一类问题的方法排序算法 根据元素大小关系排序 从小到大 从大到小冒泡 选择 插入 快排希尔排序 归并排序 堆排序 冒泡排序 从头到尾比较 每一轮将最大的数沉底 或者最小数字上浮 选择排序 1 ...
- python 数据结构与算法之排序(冒泡,选择,插入)
目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习 ...
- java 基础排序(冒泡、插入、选择、快速)算法回顾
java 基础排序(冒泡.插入.选择.快速)算法回顾 冒泡排序 private static void bubbleSort(int[] array) { int temp; for (int i = ...
- python 中的一些基础算法:递归/冒泡/选择/插入
递归算法 如果一个函数包含了对自己的调用,那么这个函数就是递归的. 比如我们计算下1-7乘法的计算: def func(n): if n ==1 : return 1 return n*func(n- ...
- 【数据结构 C++】排序——冒泡、插入、选择、希尔、归并、快排、堆排序
LeetCode 912. 排序数组 给你一个整数数组 nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:nums = ...
- 基本排序-冒泡/选择/插入(python)
# -*- coding: utf-8 -*- import random def bubble_sort(seq): n = len(seq) for i in range(n-1): print( ...
- php中usort自定义排序如何使用
php中usort自定义排序如何使用 一.总结 一句话总结:多写一个规则函数,而这个函数的写法和普通函数一样,调用的时候规则函数用函数名的字符串. 1.用户自定义规则函数有哪三个? usort — 使 ...
- php六种基础算法:冒泡,选择,插入,快速,归并和希尔排序法
$arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序法 * 思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来. * 比 ...
- iOS 开发中常用的排序(冒泡、选择、快速、插入、希尔、归并、基数)算法
1.冒泡排序: 冒泡算法是一种基础的排序算法,这种算法会重复的比较数组中相邻的两个元素.如果一个元素比另一个元素大(小),那么就交换这两个元素的位置.重复这一比较直至最后一个元素.这一比较会重复n-1 ...
随机推荐
- 自制Linux映像和发行版Robomind
通常ARM开发板厂商会提供已编译好的Linux映像供用户使用.我手上的MarS Board的厂商提供了Ubuntu映像,只是版本有点老,文件系统也比较大.之前我已经移植了较新的Linux内核,现在我想 ...
- Python3.x:获取代理ip以及使用
Python3.x:获取代理ip以及使用 python爬虫浏览器伪装 #导入urllib.request模块 import urllib.request #设置请求头 headers=("U ...
- 照着官网来安装openstack pike之keystone安装
openstack基础环境安装完成后,现在开启安装keystone服务(在控制节点上执行下面所有操作) 1.为keystone创建数据库 mysql -u root -p MariaDB [(none ...
- 20145302张薇《Java程序设计》第三周学习总结
20145302张薇<Java程序设计>第三周学习总结 教材学习内容总结 第四章 定义类 一个原始码中有多少类就会有多少.class文档. 标准类 使用java.util.scanner让 ...
- 《Java 程序设计》团队博客第十一周(第一次)
<Java 程序设计>团队博客第十一周(第一次) 团队项目 1.项目内容.目标 项目内容 本组的团队项目准备实现一个有关于大富翁有的游戏程序. 大富翁游戏,以经营权为主要的游戏方式,通过购 ...
- Centos7服务器搭建VNC Server环境
在企业级项目的开发中,尤其是分布式项目,经常直接在服务器上进行开发工作,操作系统环境一般是Centos 7.普遍状况是,在服务器上安装IDE 开发工具,通过 Xshell等工具远程启动,本地通过虚拟桌 ...
- 数据结构实习 problem O Huffman Tree
Huffman Tree 题目描述 对输入的英文大写字母进行统计概率 然后构建哈夫曼树,输出是按照概率降序排序输出Huffman编码. 输入 大写字母个数 n 第一个字母 第二个字母 第三个字母 .. ...
- jQuery Ajax总结
jQuery对Ajax的操作进行了封装.jQuery中\(.ajax()属于最底层的方法,这个放在后面说,首先看看封装了\).ajax()的方法. load()方法 load()可以远程载入HTML并 ...
- $.extendGit 丢弃所有本地修改的方法
git checkout . #本地所有修改的.没有的提交的,都返回到原来的状态 git stash #把所有没有提交的修改暂存到stash里面.可用git stash pop回复. git rese ...
- Google Java编程风格指南中文版(转)
作者:Hawstein出处:http://hawstein.com/posts/google-java-style.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Cre ...