代码:

            int[] arr = { 2, 3, 4, 6, 1, 5, 4 };
// 冒泡排序:把最小的往前冒 O(n2)
//int temp1;
//for (int i = 0; i < arr.Length - 1; i++)
//{
// for (int j = i + 1; j < arr.Length; j++)
// {
// if (arr[j] < arr[i])
// {
// temp1 = arr[j];
// arr[j] = arr[i];
// arr[i] = temp1;
// }
// }
//}
// 选择排序:从小到大依次选出来 O(n2)
//for (int i = 0; i < arr.Length - 1; i++)
//{
// int temp2 = arr[i];
// int index = i;
// for (int j = i + 1; j < arr.Length; j++)
// {
// if (arr[j] < temp2)
// {
// temp2 = arr[j];
// index = j;
// }
// }
// arr[index] = arr[i];
// arr[i] = temp2;
//}
// 直接插入排序:适合基本有序 O(n2)
//for (int i = 1; i < arr.Length; i++)
//{
// int temp = arr[i];
// int j;
// for (j = i - 1; j >= 0; j--)
// {
// if (temp > arr[j])
// {
// break;
// }
// arr[j + 1] = arr[j];
// }
// arr[j + 1] = temp;
//}
// 希尔排序
//int gap = arr.Length / 2;
//while (gap >= 1)
//{
// // 把距离为 gap 的元素编为一个组,扫描所有组
// for (int i = gap; i < arr.Length; i++)
// {
// int j = 0;
// int temp = arr[i];
// // 对距离为 gap 的元素组进行排序
// for (j = i - gap; j >= 0 && temp < arr[j]; j = j - gap)
// {
// arr[j + gap] = arr[j];
// }
// arr[j + gap] = temp;
// }
// gap = gap / 2;
//} for (int i = 0; i < arr.Length; i++)
{
Console.WriteLine(arr[i]);
}
Console.ReadLine();

二、程序员内功修炼(排序)

1、直接插入排序:适合数组基本有序的情况

  像打扑克牌,从前往后对应,把数字插入到合适的位置,如:

  

  初始值3,认为一个已经有序的序列

  第一次遍历:6和3比

  第二次遍历:5和6、5和3

  第三次遍历:9和6

  弟四次遍历:7和9、7和6

  以此类推。。

  代码:

        public static int[] InsertionSort(int[] arr)
{
/*
数据结构-数组
最差时间复杂度-输入的序列为降序,复杂度为O(n^2)
最优时间复杂度-输入的序列为升序,复杂度为O(n)
辅助空间-O(1)
稳定性-稳定
*/
for (int i = 1; i < arr.Length; i++)
{
int temp = arr[i];
int j = i - 1;
while (j >= 0 && temp < arr[j])
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
return arr;
}

2、二分插入排序(是对直接插入排序的改进):适合数组较长的情况

  直接插入排序每次遍历均是从右往左找,直到找到比自己小的,当序列足够长的情况下,这很耗时

  二分是取前面有序序列的中间值做对比,一半一半缩小范围,减少排序对比时间。

        public static int[] BinarySort(int[] arr)
{
/*
数据结构-数组
最差时间复杂度-输入的序列为降序,复杂度为O(n^2)
最优时间复杂度-输入的序列为升序,复杂度为O(log2 n)
辅助空间-O(1)
稳定性-稳定
*/
for (int i = 1; i < arr.Length; i++)
{
int temp = arr[i];
int low = 0;
int high = i - 1;
while (low <= high)
{
int mid = (low + high) / 2;
if (temp >= arr[mid])
low = mid + 1;
else
high = mid - 1;
}
for (int j = i - 1; j >= low; j--)
{
arr[j + 1] = arr[j];
}
arr[low] = temp;
}
return arr;
}

3、希尔排序

  又称为缩小增量排序,定义排序间隔,并逐步缩小增量,如图:

  

        public static int[] ShellSort(int[] arr)
{
/*
数据结构-数组
最差时间复杂度-根据步长的不同而不同,已知最好的为O(n(log2 n)^2)
最优时间复杂度-O(n)
辅助空间-O(1)
稳定性-不稳定
*/
for (int gap = arr.Length / 2; gap >= 1; gap = gap / 2)
{
for (int i = gap; i < arr.Length; i++)
{
int temp = arr[i];
int j = i - gap;
while (j >= 0 && temp < arr[j])
{
arr[j + gap] = arr[j];
j = j - gap;
}
arr[j + gap] = temp;
}
}
return arr;
}

4、冒泡排序

  最小的往前冒  或者  最大的往后冒

        public static int[] BubbleSort(int[] arr)
{
/*
数据结构-数组
最差时间复杂度-O(n^2)
最优时间复杂度-O(n^2)
辅助空间-O(1)
稳定性-稳定
*/
for (int i = 0; i < arr.Length - 1; i++)
{
for (int j = i + 1; j < arr.Length; j++)
{
if (arr[j] < arr[i])
{
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
return arr;
}

5、快速排序(目前最好的排序)

  以第一个元素为基准值,把剩余元素小的放前边,大的放后边

  

        public static int[] QuickSort(int[] arr, int low, int high)
{
/*
数据结构-数组
最差时间复杂度-每次选取的基准值都是最大或者最小O(n^2)
最优时间复杂度-每次选取的基准值都是中位数O(nlogn)
辅助空间-主要是递归造成的栈空间的使用,取决于递归树的深度,一般为O(logn),最差为O(n)
稳定性-不稳定
*/
if (low >= high)
return arr;
int i = low;
int j = high;
int temp = arr[i];//基准值
while (i < j)//从两端向中间扫描,跳出循环时i=j
{
while (i < j && arr[j] >= temp)//从右往左
j--;
arr[i] = arr[j];
while (i < j && arr[i] <= temp)//从左往右
i++;
arr[j] = arr[i];
}
arr[i] = temp;// 基准值回归正确位置
QuickSort(arr, low, i - 1);
QuickSort(arr, i + 1, high);
return arr;
}

6、直接选择排序

  直接选择最小的,和第一位替换位置,以此类推

        public static int[] SelectionSort(int[] arr)
{
/*
数据结构-数组
最差时间复杂度-O(n^2)
最优时间复杂度-O(n^2)
辅助空间-O(1)
稳定性-不稳定
*/
for (int i = 0; i < arr.Length - 1; i++)
{
int k = i; // k指向最小值索引
for (int j = i + 1; j < arr.Length; j++)
if (arr[j] < arr[k])
k = j;
if (k != i)
{
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
return arr;
}

几种排序(c#实现)的更多相关文章

  1. iOS可视化动态绘制八种排序过程

    前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...

  2. 模板化的七种排序算法,适用于T* vector<T>以及list<T>

    最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...

  3. 几种排序算法的学习,利用Python和C实现

    之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...

  4. ACM 一种排序

    一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...

  5. 秒杀9种排序算法(JavaScript版)

    一:你必须知道的 1> JS原型 2> 排序中的有序区和无序区 3> 二叉树的基本知识 如果你不知道上面三个东西,还是去复习一下吧,否则,看下面的东西有点吃力. 二:封装丑陋的原型方 ...

  6. nyoj 8 一种排序

    一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...

  7. JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)

    每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...

  8. java数组中的三种排序方法中的冒泡排序方法

    我记得我大学学java的时候,怎么就是搞不明白这三种排序方法,也一直不会,现在我有发过来学习下这三种方法并记录下来. 首先说说冒泡排序方法:冒泡排序方法就是把数组中的每一个元素进行比较,如果第i个元素 ...

  9. PHP的几种排序算法的比较

    这里列出了几种PHP的排序算法的时间比较的结果,,希望对大家有所帮助 /* * php 四种排序算法的时间与内置的sort排序比较 * 3000个元素,四种算法的排序所用的时间比较 * 冒泡排序 85 ...

  10. java实现8种排序算法(详细)

    八种排序分别是:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 希尔排序在时间性能上优于直接插入排序,但希尔排序是一种不稳定排序. 快速排序的时间性能也优于冒泡 ...

随机推荐

  1. SQL注入漏洞原理与利用

    SQL注入漏洞原理与利用 SQL注入漏洞流程 判断注入类型 判断字段个数 查询回显位 查询数据库名 查询表.字段名 查询内容 判断注入类型 1.数字型注入点判断 当要输入的参数x为数字型时,后端脚本中 ...

  2. React报错之Too many re-renders

    总览 产生"Too many re-renders. React limits the number of renders to prevent an infinite loop" ...

  3. hashlib模块、subprocess模块、loggin日志模块及实战

    hashlib加密模块 目录 hashlib加密模块 加密补充说明 subprocess模块 logging日志模块 日志的组成 日志配置字典 配置参数 1.何为加密 将明文数据处理成密文数据 让人无 ...

  4. 【机器学习】李宏毅——Flow-based Generative Models

    前文我介绍了部分关于生成学习的内容,可以参考我这篇博文点此 前面介绍的各个生成模型,都存在一定的问题: 对于PixelRNN这类模型来说,就是从左上角的像素开始一个个地进行生成,那么这个生成顺序是否合 ...

  5. 16、SQL操作JSON字段

    Mysql5.7版本以后提供一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(document elements)的内部二进制(internal binar ...

  6. 德摩根定律的证明 De Morgan's law

    De Morgan's Laws Lemma 1: \((\bigcup_n S_n)^c=\bigcap_n S_n^c\) Proof for Lemma 1: \[\because \foral ...

  7. [OpenCV实战]30 使用OpenCV实现图像孔洞填充

    在本教程中,我们将学习如何填充二值图像中的孔.考虑下图左侧的图像.假设我们想要找到一个二值掩模,它将硬币与背景分开,如下图右侧图像所示.在本教程中,包含硬币的圆形区域也将被称为前景. 请注意,硬币的边 ...

  8. [UOJ96] 【集训队互测2015】胡策的小树

    先考虑不掺金坷垃的做法. 设猴子处于 \(i\) 节点的概率为 \(f_i\),列出方程如下(\(i\) 的祖先包括自身): \[f_i = \sum_{j为i祖先}\frac{1-p_j}{siz_ ...

  9. Docker 搭建 Wordpress 个人博客

    Docker安装 更新软件库(可选),将所用到的yum软件更新到最新 yum -y update docker一键安装命令: curl -fsSL https://get.docker.com | b ...

  10. python之路43 JavaScript语法BOM与DOM jQuery对比 标签绑定事件

    前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DO ...