C排序算法
几个常用的排序算法:插入排序、快速排序、归并排序
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/************************************************
* 插入排序法
* 第1次循环: 5, 3, 4, 6, 2, 1 -> 5, 5, 4, 6, 2, 1 -> 3, 5, 4, 6, 2, 1
* 第2次循环: 3, 5, 4, 6, 2, 1 -> 3, 5, 5, 6, 2, 1 -> 3, 4, 5, 6, 2, 1
* 第4次循环: 3, 4, 5, 6, 2, 1 -> 3, 3, 4, 5, 6, 1 -> 2, 3, 4, 5, 6, 1
* 第5次循环: 2, 3, 4, 5, 6, 1 -> 2, 2, 3, 4, 5, 6 -> 1, 2, 3, 4, 5, 6
************************************************/
void insert_sort(int *arr, int n){
int i = , j = , tmp = ;
for( i = ; i < n; i++ ){
if( arr[i-] > arr[i] ){
tmp = arr[i];
for( j = i - ; arr[j] > tmp && j >= ; j-- ){
arr[j+] = arr[j];
}
arr[j+] = tmp;
}
/*
printf("the %d times iteration : ",i);
for( int j = 0 ; j < n; j++ ){
printf("%2d ",arr[j]);
}
printf("\n");
*/
}
}
/************************************************
* 快速排序法
************************************************/
int partition(int *arr, int low, int high){
int tmp = arr[low];
while( low < high ){
while( low < high && arr[high]>= tmp ) high--;
arr[low] = arr[high];
while( low < high && arr[low] <= tmp ) low++;
arr[high] = arr[low];
}
arr[low] = tmp;
return low;
}
void q_sort(int *arr, int low, int high){
int pivot = ;
while( low < high ){
pivot = partition( arr,low,high ); // 对arr一分为二
q_sort( arr,low,pivot- ); // 低子表递归排序
low = pivot + ; // 尾递归
}
}
/************************************************
* 2分归并排序
************************************************/
void merge_sort( int *arr,int *tmp,int s_idx,int m_idx,int e_idx){
int i = s_idx, j = m_idx+, k = s_idx;
while( i != m_idx+ && j != e_idx+ ){
if( arr[i] < arr[j] ){
tmp[k++] = arr[i++];
}
else{
tmp[k++] = arr[j++];
}
}
while( i != m_idx+ ){
tmp[k++] = arr[i++];
}
while( j != e_idx+ ){
tmp[k++] = arr[j++];
}
for( i = s_idx;i <= e_idx;i++ ){
arr[i] = tmp[i];
}
}
void m_sort(int *arr,int *tmp,int s_idx,int e_idx){
if( s_idx < e_idx ){
int mid = (s_idx + e_idx) / ; // 将arr分为arr[0..mid]和arr[mid+1..n-1]
m_sort( arr,tmp,s_idx,mid); // 递归将arr[0..mid]归并为有序的tmp[0..mid]
m_sort( arr,tmp,mid+,e_idx); // 递归将arr[mid+1..n-1]归并为有序的tmp[mid+1..n-1]
merge_sort( arr,tmp,s_idx,mid,e_idx); // 将arr[0..mid]和arr[mid+1..n-1]归并到tmp[0..n-1]
}
}
/************************************************
* 反转序列
************************************************/
void reverse(int *arr, int n){
int s_idx = , e_idx = n - ;
int tmp = ;
while( s_idx < e_idx ){
tmp = arr[s_idx];
arr[s_idx++] = arr[e_idx];
arr[e_idx--] = tmp;
}
}
void show_arr(int *arr, int n){
for( int i = ; i < n; i++ ){
printf("%2d ",arr[i]);
}
printf("\n");
}
/************************************************
* 二分查找
* 数组 1 2 3 4 5 6 查找 5
* | | |
* low mid high
* 循环1次:
* 1 2 3 4 5 6 查找 5
* | | |
* low mid high
************************************************/
bool binary_search(int *arr, int n, int key){
if( NULL == arr ) return false;
int low = , high = n - , mid = ; // low为数组首位,high为数组末位
while( low < high ){
mid = low + (( high - low ) >> ); //防止溢出,移位也更高效。每次循环都要更新。
if( key < arr[mid] ){ // 若关键字小于中值
high = mid - ; // 高下标调整到中下标小1
}
else if( key > arr[mid] ){ // 若关键字大于中值
low = mid + ; // 低下标调整到中下标加1
}
else{
return true;
}
}
return false;
}
int main(){
int i = ;
int arr[] = {, , , , , , };
int len = sizeof(arr)/sizeof(arr[]);
int tmp[len];
m_sort(arr,tmp,,len-);
printf("m_sort:\n");
show_arr(arr,len); reverse(arr,len);
insert_sort(arr,len);
printf("insert_sort:\n");
show_arr(arr,len); reverse(arr,len);
q_sort(arr,,len-);
printf("q_sort:\n");
show_arr(arr,len); int key = ;
printf("%d is%s in the arr\n",key,( binary_search(arr,len,key) ) ? "" : " not");
}
输出:
m_sort:
1 2 3 4 5 6
insert_sort:
1 2 3 4 5 6
q_sort:
1 2 3 4 5 6
5 is in the arr
C排序算法的更多相关文章
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 几大排序算法的Java实现
很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...
- 排序算法----基数排序(RadixSort(L,max))单链表版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 排序算法汇总(C/C++实现)
前言: 本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...
- 用Java来写常见的排序算法
随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...
- 模板化的七种排序算法,适用于T* vector<T>以及list<T>
最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...
- 排序算法总结第二弹----冒泡排序---javascript描述
上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...
- 排序算法总结------选择排序 ---javascript描述
每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...
随机推荐
- day27-python之迭代器协议
1.item系列方法 # class Foo: # def __getitem__(self, item): # print('getitem',item) # return self.__dict_ ...
- 设置Redis集群访问密码(不停机设置)
依次登陆6个节点 cd /mysystest ./redis/bin/redis-cli -c -h 192.168.43.86 -p 7301 执行以下命令 config set masterau ...
- Docker -compose install Harbor
Docker-compose Harbor install Docker install Yum install docker-compose 首先安装 yum configuation 管理工具 [ ...
- sql的匹配和正则表达式
1. 匹配:like 关键字 #假设存在表 my_test_copy select * from my_test_copy; 则使用like关键词匹配:注意下划线 '_'和百分号 '%' # 下划线' ...
- vi / vim 字符替换详解
:s/idoxu/isTester.com/g 替换当前行所有 idoxu 为 isTester.com :n,$s/idoxu/isTester.com/ #替换第 n 行开始到最后一行中每一行的第 ...
- 运维开发笔记整理-URL配置
运维开发笔记整理-URL配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.URL路由 对于高质量的Web应用来说,使用简洁,优雅的URL的路由是一个非常值得重视的细节.Dja ...
- HTML&CSS基础-属性选择器
HTML&CSS基础-属性选择器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.html源代码 <!DOCTYPE html> <html> & ...
- trap - 在脚本中处理信号
一:用途说明 trap命令是shell内建的命令,它用在脚本中指定信号如何处理. 比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是 ...
- Java内存模型、JVM内存结构和Java对象模型
JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途.其中有些区域随着虚拟机进程的启动而存 ...
- WCF 学习系列——WCF的学习基础
这个系列的博客由WCF4 高级编程学习记录,如有错误请指正. 首先介绍一些概念: SOA: (Service-Oriented Architecture 面向服务架构),一种架构方法,也是一种编程模式 ...