几种排序(c#实现)
代码:
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#实现)的更多相关文章
- iOS可视化动态绘制八种排序过程
前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...
- 模板化的七种排序算法,适用于T* vector<T>以及list<T>
最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...
- 几种排序算法的学习,利用Python和C实现
之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...
- ACM 一种排序
一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...
- 秒杀9种排序算法(JavaScript版)
一:你必须知道的 1> JS原型 2> 排序中的有序区和无序区 3> 二叉树的基本知识 如果你不知道上面三个东西,还是去复习一下吧,否则,看下面的东西有点吃力. 二:封装丑陋的原型方 ...
- nyoj 8 一种排序
一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...
- JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)
每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...
- java数组中的三种排序方法中的冒泡排序方法
我记得我大学学java的时候,怎么就是搞不明白这三种排序方法,也一直不会,现在我有发过来学习下这三种方法并记录下来. 首先说说冒泡排序方法:冒泡排序方法就是把数组中的每一个元素进行比较,如果第i个元素 ...
- PHP的几种排序算法的比较
这里列出了几种PHP的排序算法的时间比较的结果,,希望对大家有所帮助 /* * php 四种排序算法的时间与内置的sort排序比较 * 3000个元素,四种算法的排序所用的时间比较 * 冒泡排序 85 ...
- java实现8种排序算法(详细)
八种排序分别是:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 希尔排序在时间性能上优于直接插入排序,但希尔排序是一种不稳定排序. 快速排序的时间性能也优于冒泡 ...
随机推荐
- Qt的进程间通信,以服务器的形式,手把手教你VS上进行Qt的COM、ActivedQt Server的开发,比保姆还保姆(一)
Qt的进程间通信,以Active服务器的形式,手把手教你VS上进行Qt的COM.ActivedQt Server的开发,比保姆还保姆 写在前面,文中的ID有部分对不上,因为我中途改了一下,我建议你在实 ...
- 浅谈入行Qt桌面端开发程序员-从毕业到上岗(1):当我们说到桌面端开发时,我们在谈论什么?
谈谈我自己 大家好,我是轩先生,是一个刚入行的Qt桌面端开发程序员.我的本科是双非一本的数学专业,22年毕业,只是部分课程与计算机之间有所交叉,其实在我毕业的时候并没有想过会成为一名程序员,也没有想过 ...
- 彻底弄懂Javascript模块导入导出
笔者开始学习Javascript的时候,对模块不太懂,不知道怎么导入模块,导出模块,就胡乱一通试 比如 import xx from 'test.js' 不起作用,就加个括号 import {xx} ...
- vivo 低代码平台【后羿】的探索与实践
作者:vivo 互联网前端团队- Wang Ning 本文根据王宁老师在"2022 vivo开发者大会"现场演讲内容整理而成.公众号回复[2022 VDC]获取互联网技术分会场议题 ...
- 记一次在CentOS上安装GitLab的流程
1.本次环境说明 系统:Centos7.6 IP地址:http://192.168.3.213: 最低配置要求:2核心CPU和4G内存,这是因为[GitLab]的整体运行包含了多个进程 2.自行安装 ...
- [能源化工] TE田纳西-伊斯曼过程数据集
TE田纳西-伊斯曼过程数据集简介 TE数据集是现在故障诊断中的应用较多的一种数据集.主要介绍论文上都有. 具体介绍见:http://depts.washington.edu/control/LARRY ...
- Java基础篇——常用类
Objec类 Test t1 = new Test(); Test t2 = new Test(); //toString方法,对某个对象的字符串输出 //getClass方法,返回该对象的Class ...
- Golang编译
SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build main.go SET CGO_ENABLED=0 SET GOOS=linux ...
- MySQL中多种排名实现
一.数据库表结构以及数据 CREATE TABLE `forlan_score` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', ...
- 行为型模式 - 责任链模式Chain of Responsibility
我就想知道我又哪里有广告植入了,告诉我. 学习而来,代码是自己敲的.也有些自己的理解在里边,有问题希望大家指出. 模式的定义与特点 责任链(Chain of Responsibility)模式的定义: ...