各种排序算法及c语言实现
插入排序O(n^2)
冒泡排序 O(n^2)
选择排序 O(n^2)
快速排序 O(n log n)
堆排序 O(n log n)
归并排序 O(n log n)
希尔排序 O(n^1.25)
1.插入排序 O(n^2)
void insert_sort(int* array,unsignedint n){
int i,j;
int temp;
for(i=;i<n;i++){
temp=*(array+i);
for(j=i;j>&&*(array+j-)>temp;j--){
*(array+j)=*(array+j-);
}
*(array+j)=temp;
}
}
2.冒泡排序 O(n^2)
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
#include<stdio.h>
#defineSIZE8
void bublle_sort(int a[],int n){//n为数组a的元素个数
int i,j,temp;
for(j=;j<n-;j++)
for(i=;i<n--j;i++)
if(a[i]>a[i+]){//数组元素大小按升序排列
temp=a[i];
a[i]=a[i+];
a[i+]=temp;
}
}
int main(){
int number[SIZE]={,,,,,,,};
int i;bublle_sort(number,SIZE);
for(i=;i<SIZE;i++){
printf("%d",number[i]);
}
printf("\n");
}
3.选择排序 O(n^2)
void select_sort(int * a, int n){
register int i, j, min, t;
for( i =; i < n -; i ++) {
min = i; //查找最小值
for( j = i +; j < n; j ++)
if( a[min] > a[j])
min = j; //交换
if(min != i) {
t = a[min];
a[min] = a[i];
a[i] = t;
}
}
}
4.快速排序 O(n log n)
void QuickSort(int a[],int numsize){//a是整形数组,numsize是元素个数
int i=,j=numsize-;
int val=a[];//指定参考值val大小
if(numsize>){//确保数组长度至少为2,否则无需排序
while(i<j{//循环结束条件
for(;j>i;j--)//从后向前搜索比val小的元素,找到后填到a[i]中并跳出循环
if(a[j]<val){
a[i]=a[j];break;
}
for(;i<j;i++)//从前往后搜索比val大的元素,找到后填到a[j]中并跳出循环
if(a[i]>val){
a[j]=a[i];break;
}
}
a[i]=val;//将保存在val中的数放到a[i]中
QuickSort(a,i);//递归,对前i个数排序
QuickSort(a+i+,numsize--i);//对i+1到numsize这numsize-1-i个数排序
}
}
5. 堆排序 O(n log n)
// array是待调整的堆数组,i是待调整的数组元素的位置,nlength是数组的长度
//本函数功能是:根据数组array构建大根堆
void HeapAdjust(int array[], int i, int nLength)
{
int nChild;
int nTemp;
for (nTemp = array[i]; * i + < nLength; i = nChild)
{
// 子结点的位置=2*(父结点位置)+ 1
nChild = * i + ;
// 得到子结点中较大的结点
if ( nChild < nLength- && array[nChild + ] > array[nChild])
++nChild;
// 如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点
if (nTemp < array[nChild])
{
array[i] = array[nChild];
array[nChild]= nTemp;
}
else
// 否则退出循环
break;
}
} // 堆排序算法
void HeapSort(int array[],int length)
{
int tmp;
// 调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素
//length/2-1是第一个非叶节点,此处"/"为整除
for (int i = floor(length -)/ ; i >= ; --i)
HeapAdjust(array, i, length);
// 从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素
for (int i = length - ; i > ; --i)
{
// 把第一个元素和当前的最后一个元素交换,
// 保证当前的最后一个位置的元素都是在现在的这个序列之中最大的
/// Swap(&array[0], &array[i]);
tmp = array[i];
array[i] = array[];
array[] = tmp;
// 不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值
HeapAdjust(array, , i);
}
}
6.归并排序 O(n log n)
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个 有序表合并成一个有序表,称为二路归并。
//归并操作
void Merge(int sourceArr[], int targetArr[], int startIndex, int midIndex, int endIndex)
{
int i, j, k;
for(i = midIndex+, j = startIndex; startIndex <= midIndex && i <= endIndex; j++)
{
if(sourceArr[startIndex] < sourceArr[i])
{
targetArr[j] = sourceArr[startIndex++];
}
else
{
targetArr[j] = sourceArr[i++];
}
} if(startIndex <= midIndex)
{
for(k = ; k <= midIndex-startIndex; k++)
{
targetArr[j+k] = sourceArr[startIndex+k];
}
} if(i <= endIndex)
{
for(k = ; k <= endIndex- i; k++)
{
targetArr[j+k] = sourceArr[i+k];
}
}
}
//内部使用递归,空间复杂度为n+logn
void MergeSort(int sourceArr[], int targetArr[], int startIndex, int endIndex)
{
int midIndex;
int tempArr[]; //此处大小依需求更改
if(startIndex == endIndex)
{
targetArr[startIndex] = sourceArr[startIndex];
}
else
{
midIndex = (startIndex + endIndex)/;
MergeSort(sourceArr, tempArr, startIndex, midIndex);
MergeSort(sourceArr, tempArr, midIndex+, endIndex);
Merge(tempArr, targetArr,startIndex, midIndex, endIndex);
}
} //调用
int _tmain(int argc, _TCHAR* argv[])
{
int a[]={,,,,,,,};
int b[];
MergeSort(a, b, , );
for(int i = ; i < sizeof(a) / sizeof(*a); i++)
cout << b[i] << ' ';
cout << endl;
system("pause");
return ;
}
void ShellSort(int a[], int n){
int d, i, j, temp;
for(d = n/;d >= ;d = d/){
for(i = d; i < n;i++){
temp = a[i];
for(j = i - d;(j >= ) && (a[j] > temp);j = j-d){
a[j + d] = a[j];
}
a[j + d] = temp;
}
}
}
各种排序算法及c语言实现的更多相关文章
- 【最全】经典排序算法(C语言)
算法复杂度比较: 算法分类 一.直接插入排序 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中. 它的算法步骤可以大致归纳如下: 从未排好的序列中拿出首 ...
- 排序算法总结(C语言版)
排序算法总结(C语言版) 1. 插入排序 1.1 直接插入排序 1.2 Shell排序 2. 交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择 ...
- 几种经典排序算法的R语言描述
1.数据准备 # 测试数组 vector = c(,,,,,,,,,,,,,,) vector ## [] 2.R语言内置排序函数 在R中和排序相关的函数主要有三个:sort(),rank(),ord ...
- 【转载】常见十大经典排序算法及C语言实现【附动图图解】
原文链接:https://www.cnblogs.com/onepixel/p/7674659.html 注意: 原文中的算法实现都是基于JS,本文全部修改为C实现,并且统一排序接口,另外增加了一些描 ...
- [answerer的算法课堂]简单描述4种排序算法(C语言实现)
[answerer的算法课堂]简单描述4种排序算法(C语言实现) 这是我第一次写文章,想要记录自己的学习生活,写得不好请包涵or指导,本来想一口气写好多种,后来发现,写太多的话反而可读性不强,而且,我 ...
- 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述
关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学 ...
- 常用七大经典排序算法总结(C语言描述)
简介 其中排序算法总结如下: 一.交换排序 交换排序的基本思想都为通过比较两个数的大小,当满足某些条件时对它进行交换从而达到排序的目的. 1.冒泡排序 基本思想:比较相邻的两个数,如果前者比后者大,则 ...
- 排序算法的C语言实现(上 比较类排序:插入排序、快速排序与归并排序)
总述:排序是指将元素集合按规定的顺序排列.通常有两种排序方法:升序排列和降序排列.例如,如整数集{6,8,9,5}进行升序排列,结果为{5,6,8,9},对其进行降序排列结果为{9,8,6,5}.虽然 ...
- 排序算法的C语言实现(下 线性时间排序:计数排序与基数排序)
计数排序 计数排序是一种高效的线性排序. 它通过计算一个集合中元素出现的次数来确定集合如何排序.不同于插入排序.快速排序等基于元素比较的排序,计数排序是不需要进行元素比较的,而且它的运行效率要比效率为 ...
- [算法] 常见排序算法总结(C语言版)
常见排序算法总结 本文对比较常用且比较高效的排序算法进行了总结和解析,并贴出了比较精简的实现代码,包括选择排序.插入排序.归并排序.希尔排序.快速排序等.算法性能比较如下图所示: 1 冒泡排序 基本原 ...
随机推荐
- 【原】Arrays.binarySearch() 的用法
Arrays.binarySearch() 的用法 1.binarySearch(Object[] a, Object key) Searches the specified array for th ...
- while MyJob = '程序员' do --- 序
因为自己的际遇,忽然想写点什么留在这个世上.也许只是想证明自己活过吧. 所以,这不会是一个过去时的小说,这将是一个接近进行时的记叙.之所以是接近,因为我只有在空余时间,才能记录最近的经历.出于保护隐私 ...
- nyoj 找球号三(除了一个数个数为基数,其他为偶数,编程之美上的)
#include<iostream> #include<stdio.h> using namespace std; int main() { int len; while(ci ...
- Sitemap Editors for Dynamics CRM 2013
I’ve started using a couple of different sitemap editors in my projects for CRM 2013. These tools he ...
- ffmpeg关于aac解码
ffmpeg从0.11.3版本开始,默认解码aac为AV_SAMPLE_FMT_FLT (float) 0.11.2以前版本解码aac为AV_SAMPLE_FMT_S16 (16位short型)
- linux定时器用法
linux定时器 原文出自http://www.cnblogs.com/processakai/archive/2012/04/11/2442294.html 今天看书看到了关于alarm的一些用法 ...
- iOS 检测网络状态
一般有两种方式,都是第三方的框架,轮子嘛,能用就先用着,后面再优化. 一:Reachability 1.首先在AppDelegate.h添加头文件"Reachability.h", ...
- scrollTop 值为 0
由scrollTop兼容问题引起: 在 Firefox 和 IE 中,使用 document.documentElement.scrollTop 获取: 在 Chrome 中,使用 document. ...
- BDB (Berkeley DB)数据库简单介绍(转载)
近期要使用DBD,于是搜了下相关的资料,先贴个科普性的吧: 转自http://www.javaeye.com/topic/202990 DB综述DB最初开发的目的是以新的HASH訪问算法来取代旧的hs ...
- CameraTest
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage #device = MonkeyRunner.wa ...