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描述
每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...
随机推荐
- PM2 监控 Spring Boot 项目运行
更多 PM2 的用法介绍请参考: PM2简易使用手册 - 掘金 由于 PM2 通常都用于 node 应用, 所以 exec_mode 应写为 fork, 其中最重要的是 args, -jar 和 ja ...
- DevOps简介_转
转自:DevOps简介 刘大飞 DevOps 是一个完整的面向IT运维的工作流,以 IT 自动化以及持续集成(CI).持续部署(CD)为基础,来优化程式开发.测试.系统运维等所有环节. Dev ...
- js基础知识4
原文链接:https://book.apeland.cn/details/361/#3.getElementsByClassName()方法 DOM介绍 1.文档:DOM中的”D” DOM是”Do ...
- 【转】spring 自定义注解(annotation)与 aop获取注解
首先我们先介绍Java自定义注解. 在开发过程中,我们实现接口的时候,会出现@Override,有时还会提示写@SuppressWarnings.其实这个就是Java特有的特性,注解. 注解就是某种注 ...
- jmeter性能测试监控
Jmeter监控服务器资源配置如下: 1.进入https://jmeter-plugins.org/downloads/all/下载plugins-manager.jar,放置到jmeter安装目录/ ...
- jdk1.8换成11,启动项目报错java.net.MalformedURLException: unknown protocol: jrt
jdk11 Information:Internal caches are corrupted or have outdated format, forcing project rebuild: Mo ...
- Python练习题---判断回文数
设n是一个任意自然数,如果n的各位数字反向排序所得的自然数与n相等,则n被称为回文数,从键盘输入一个5位数字 ,请编写程序判断这个数字是不是回文数. 思路:先获取一个字符串,再判断该字符串是否满足是自 ...
- Dubbo源码分析(2):ServiceBean
ServiceBean时序图
- tensorflow LSTM+CTC使用详解
最近用tensorflow写了个OCR的程序,在实现的过程中,发现自己还是跳了不少坑,在这里做一个记录,便于以后回忆.主要的内容有lstm+ctc具体的输入输出,以及TF中的CTC和百度开源的warp ...
- 针对jar里面的图片不显示问题
做了一个html生产pdf案例. 然后把图片放到resource/static/model/img下面,生成jar包运行,发现图片不显示, 发现html里面的src必须是http域名开头的图片. 下面 ...