C++数据结构中的基本算法排序
冒泡排序
基本思想:两两比较待排序的数,发现反序时交换,直到没有反序为止。
public static void BubbleSort(int[] R)
{
for (int i = 0; i < R.Length - 1; i++)
{
bool noswap = true;
for (int j = 0; j < R.Length - 1-i; j++)
{
if (R[j] > R[j + 1])
{
int temp = R[j];
R[j] = R[j + 1];
R[j + 1] = temp;
noswap = false;
}
}
if (noswap)
{
break;
}
}
} 快速排序
基本思想:在待排序数列中任选出一个数作为基准,用这个基准将数列划分为左右两个子区,使得左子区的数都不大于基准数,而右子区的数都不小于基准数,称为完成第一次划分。如果左子区或右子区不为空,则对它进行同样的划分,直至为空为止。
public static void QUICKSORT(int[] N,int left,int right)
{
//数组元素如果不大于一个就无需排序。
if (left < right)
{
int p = PARTITION(N, left, right); //第一次划分
QUICKSORT(N, left, p-1); //递归处理左子区
QUICKSORT(N, p+1, right); //递归处理右子区
}
}
//划分
public static int PARTITION(int[] R, int left,int right)
{
int i = left;
int j = right;
int temp = R[i];
while (i != j)
{
//从左往右扫描,查找第一个比基准数小的数
while ((R[j] >= temp) && (i<j))
{
j--;
}
if (i < j)
{
//交换找到的数和基准数,由于基准数还需交换多次,所以暂时不用将temp->R[j]
R[i] = R[j];
i++;
} while ((R[i] <= temp) && (i < j))
{
i++;
}
if (i< j)
{
R[j] = R[i];
j--;
}
}
//定位基准数
R[i] = temp;
return i;
} 直接选择排序
基本思想:每次从无序数组中选出一个最小的出来,放到已排好序的数组的最后。
public static void SELECTSORT(int[] R)
{
for (int i = 0; i < R.Length-1; i++)
{
int index = i;
for (int j = i + 1; j < R.Length; j++)
{
if (R[j] < R[index])
{
index = j;
}
}
//交换R[i]和R[index]
if (index != i)
{
int t = R[i]; R[i] = R[index]; R[index] = t;
}
}
} 插入排序
基本思想:首先将数组的第一个数sortArray[0]看成是有序的,然后从第二个元素开始和它前面的元素进行比较,如果比前面的某一个数大,就交换。由于前面的元素是有序的,所以就使有序元素的个数逐渐增大,直到等于n。
public void Sort(int[] sortArray)
{
int j = 0;
int key = 0; // key为哨兵
for (int i = 1; i < sortArray.Length; i++) //[0..i-1]已经排好的有序列
{
if (sortArray[i] < sortArray[i - 1])
{
key = sortArray[i];
j = i - 1;
while (j >= 0 && key < sortArray[j]) //当sortArray[i] ≥sortArray[j] 时终止
{
sortArray[j + 1] = sortArray[j];
j--;
}
sortArray[j + 1] = key; //插入到j的后面
}
}
} 希尔排序
基本思想:通过一个逐渐减小的增量使一个数组逐渐趋近于有序从而达到排序的目的。
public void SortShell(int [] list)
{
int i;
for(i=1;i<=list.Length/9;i=3*i+1);
for(;i>0;i/=3)
{
for(int i=i+1;i<=list.Length;i+=inc)
{
int t=list[i-1];
int j=i;
while((j>inc)&&(list[j-inc-1]>t))
{
list[j-1]=list[j-inc-1];
j-=inc;
}
list[j-1]=t;
}
}
} 堆排序
基本思想:记录区的分为无序区和有序区前后两部分;用无序区的数建大根堆,得到的根(最大的数)和无序区的最后一个数交换,也就是将该根归入有序区的最前端;如此重复下去,直至有序区扩展至整个记录区。 堆排序步骤:
第一步,根据初始输入数据,利用堆的调整算法形成初始堆。
第二步,通过一系列的记录交换和重新调整堆进行排序。
最大堆的向下调整算法:
调用了O(n)次Adjust()算法,堆排序的时间复杂性为O(nlog2n)。
该算法的附加存储主要是执行记录交换时所用的一个临时记录。
因此,该算法的空间复杂性为O(1)。
堆排序是一个不稳定的排序方法。 #include <stdio.h>
void swap(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
void Adjust(int *a, int parent, int high)
{
int l = 2 * parent + 1;
int r = l + 1;
int flag = parent; if (l<=high && a[l]>a[flag])
{
flag = l;
}
if (r<=high && a[r]>a[flag])
{
flag = r;
}
if (flag != parent)
{
swap(a[parent], a[flag]);
Adjust(a, flag, high);
}
}
void HeapSort(int *a, int n)
{
int i; for (i=n-1; i>=0; i--)
{
Adjust(a, i, n - 1);
}
for (i=n-1; i>=0; i--)
{
swap(a[0], a[i]);
Adjust(a, 0, i - 1);
}
}
void Output(int *a, int n)
{
int i;
for (i=0; i<n; i++)
{
printf("\t%d", a[i]);
}
printf("\n");
}
int main()
{
int a[] = { 49, 38, 65, 97, 76, 13, 27, 49 };
int n = 8; Output(a, n);
HeapSort(a, n);
Output(a, n); return 0;
} /*
49 38 65 97 76 13 27 49
13 27 38 49 49 65 76 97
*/
C++数据结构中的基本算法排序的更多相关文章
- 彻底弄明白之数据结构中的KMP算法
如何加速朴素查找算法? KMP,当然还有其他算法,后续介绍. Knuth–Morris–Pratt string search algorithm Start at LHS of strin ...
- 数据结构中常用的排序算法 && 时间复杂度 && 空间复杂度
第一部分:数据结构中常用的排序算法 数据结构中的排序算法一般包括冒泡排序.选择排序.插入排序.归并排序和 快速排序, 当然还有很多其他的排序方式,这里主要介绍这五种排序方式. 排序是数据结构中的主要内 ...
- [Data Structure] 数据结构中各种树
数据结构中有很多树的结构,其中包括二叉树.二叉搜索树.2-3树.红黑树等等.本文中对数据结构中常见的几种树的概念和用途进行了汇总,不求严格精准,但求简单易懂. 1. 二叉树 二叉树是数据结构中一种重要 ...
- 数据结构中的棧在C#中的实现
数据结构中的棧在C#中的实现 一.大致学习 棧是一种面向表的数据结构,棧中的数据只能在标的某一短进行添加和删除操作,是一种典型的(LIFO)数据结构. 现实生活中的理解:自助餐厅的盘子堆,人们总是从顶 ...
- Java--缓存热点数据,最近最少使用算法
1.最近最少使用算法LRU (Least recently used,最近最少使用) [实现]:最常见的是使用一个链表保存缓存数据 1.新数据插入到链表头部: 2.每当缓存命中(即缓存数据被访问),将 ...
- JS的十大经典算法排序
引子 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements JavaScript. 当年,想凭借抱Java大腿火一把而不惜把自己名字给改了的JavaScript(原名LiveScript ...
- 浅析数据结构中栈与C实现
最近在搞摄像头驱动,o()︿︶)o 唉,别提有多烦,一堆寄存器就有人受的了--特么这不是单片机的开发,这是内核驱动开发-- 今天放松一下,我们来看看数据结构中的栈,这节的知识点可以说是数据结构中最容易 ...
- 【编程练习】收集的一些c++代码片,算法排序,读文件,写日志,快速求积分等等
写日志: class LogFile { public: static LogFile &instance(); operator FILE *() const { return m_file ...
- js算法排序
一.选择算法排序(算法时间复杂度为O(n²)级别) 选择排序就是选择数组中的最小的树,依次排序.第一次选择最小的数放在第一位,第二次从剩余的元素中寻找最小的元素放在第二位,第三次在剩余的数中选择最小的 ...
随机推荐
- Keras官方中文文档:常见问题与解答
所属分类:Keras Keras FAQ:常见问题 如何引用Keras? 如何使Keras调用GPU? 如何在多张GPU卡上使用Keras "batch", "epoch ...
- HiHocoder1415 : 后缀数组三·重复旋律3 & Poj2774:Long Long Message
题面 HiHocoder1415 Poj2774 Sol 都是求最长公共子串,\(hihocoder\)上讲的很清楚 把两个串拼在一起,中间用一个特殊字符隔开 那么答案就是排序后相邻两个不同串的后缀的 ...
- Delphi的RzDbgrid改变某行的背景色
本想改变符合条件的行的背景色,试了DbgridEh和原生的Dbgrid直接在DrawColumnCell事件中写重绘代码就好了,But在RzDbgrid就不起效果,查了好一会,百度了一大堆,都是千篇一 ...
- MongoDB存储引擎(下)——In-Memory
前两篇文章分别介绍了MMAPv1和WiredTiger,这两个存储引擎都是会将数据持久化存储到硬盘的,除此之外,MongoDB也有只将数据存储在内存的存储引擎,那就是In-Memory. In-Mem ...
- Spring(十二)Spring之事务
java中事务是什么? 事务是访问数据库的一个操作序列,DB应用系统通过事务集来完成对数据的存取. 事务必须遵循4个原则,即常说的 ACID A,Automicity,原子性,即事务要么被全部执行,要 ...
- 如何恢复(初始化)android studio所有设置
android studio是个大家伙,安装的时候经常出现一些问题,使用的时候也经常出现一些问题,如果,我是说如果,当你遇见一些问题不能解决的时候,可以试试重置android studio来解决问题, ...
- 【Unity3D与23种设计模式】单例模式(Singleton)
GoF中定义: "确认类只有一个对象,并提供一个全局的方法来获取这个对象" 使用单例模式的前提 它只能产生一个对象且不能够被继承 单例模式的优点: 提供方便获取唯一对象的方法 可以 ...
- 需求分析---NABCD
N(Need,需求) 我们的产品未来天气,是为了解决不爱看天气预报的群众开发一款类似备忘录式的天气预报软件.很多人认为今天天气很好,明天肯定不会差,但是风云忽变,可能明天就降大雨,所以就忽略了带伞, ...
- Proxy和Reflect
原因 最近在写 unar.js(一个技术超越react angular vue)的mvvm库.通过研究proxy的可行性.故作以下研究 Proxy代理一个函数 var fn=function(){ c ...
- 快速失败机制--fail-fast
fail-fast 机制是Java集合(Collection)中的一种错误机制.当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast(快速失败)事件.例如:当某一个线程A通过iter ...