代码:

            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. Burp Suite

    Burp Suite proxy代理 1.首先在浏览器中设置代理配置 火狐浏览器先点击右上角三个杠--选项--常规--网络设置 2.打开Burp Suite进行抓包 Proxy代理--options中 ...

  2. 06.python闭包

    python闭包 什么样的函数是 闭包函数 ? 满足以下条件: 闭:外层函数嵌套了一个内层函数. 包:内层函数调用外层函数命名空间内的名字. 举例如下: def out_func(): # 外层函数 ...

  3. 微服务项目Git仓库自动化脚本

    说明 基于微服务项目,产生的的多项目仓库管理脚本. 目录结构 xxxx Xxx1Api/ Xxx2Api/ git_clone_api.sh git_branch_dev.sh git_pull_al ...

  4. Ajax---EventLoop事件循环

    前言       JavaScript 是一门单线程执行的脚本语言.也就是说,同一时间只能做一件事情. JavaScript要运行在宿主环境中(浏览器,nodejs)下.浏览器内部有执行js代码的引擎 ...

  5. 旧酒换新瓶,新版M1/M2芯片Macos(Ventura)安装古早版本Python2.7(Python2.x)

    向下兼容特性是软件开发系统的一个重要指标,它是指一个新的系统或者软件能够与旧的系统或软件兼容并正常运行.这意味着旧系统或软件可以在新系统或软件中使用,而不会出现问题.向下兼容对于提高软件或系统的可用性 ...

  6. S2-008

    漏洞名称 S2-008(CVE-2012-0392) 远程代码执行漏洞 利用条件 Struts 2.0.0 - Struts 2.3.17 漏洞原理 S2-008 涉及多个漏洞,Cookie 拦截器错 ...

  7. 【Dubbo3终极特性】「云原生三中心架构」带你探索Dubbo3体系下的配置中心和元数据中心、注册中心的原理及开发实战(上)

    Dubb3的应用级服务发现 Dubbo3提供了全新的应用级服务发现模型,该模型在设计与实现上区别于 Dubbo2 的接口级服务发现模型. 概括来说,Dubbo3 引入的应用级服务发现主要有以下优势 适 ...

  8. 第一次Kaggle比赛心得

    新手避雷 在未组队的情况下私下共享资料属于违规行为,组队截止时间过后尤其不能这样 提交notebook的时候,kaggle的服务器只能找到前两个输出文件,所以一定要把你要提交的文件放在前两个(我们就是 ...

  9. 刷题笔记——1112:C语言考试练习题_一元二次方程

    题目 1112:C语言考试练习题_一元二次方程 代码 import math while True: try: a,b,c=map(float,input().strip().split()) del ...

  10. 行为型模式 - 命令模式Command

    模式的定义与特点 命令模式(Command Pattern),是将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化.命令模式是把发出命令的责任和执行命令的责任分割开,委派给不同的对象. ...