几个常用的排序算法:插入排序、快速排序、归并排序

#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排序算法的更多相关文章

  1. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  2. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  3. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  4. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

  5. 排序算法----基数排序(RadixSort(L,max))单链表版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  6. 排序算法汇总(C/C++实现)

    前言:     本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...

  7. 用Java来写常见的排序算法

    随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...

  8. 模板化的七种排序算法,适用于T* vector<T>以及list<T>

    最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...

  9. 排序算法总结第二弹----冒泡排序---javascript描述

    上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...

  10. 排序算法总结------选择排序 ---javascript描述

    每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...

随机推荐

  1. 服务网关ZuulFilter过滤器--如何解决跨域请求中的OPTIONS请求

    进行跨域请求的时候,并且请求头中有额外参数,比如token,客户端会先发送一个OPTIONS请求 来探测后续需要发起的跨域POST请求是否安全可接受 所以这个请求就不需要拦截,下面是处理方式 @Ove ...

  2. pod健康检查(liveness probe存活探针&&readiness probe 可读性探针)

    在Kubernetes集群当中,我们可以通过配置liveness probe(存活探针)和readiness probe(可读性探针)来影响容器的生存周期.参考文档:https://kubernete ...

  3. 虚拟机搭建IKUAI软路由

    1.登录爱快软路由的官网下载镜像(支持ISO ,GHO),这里采用iso安装 2.选择好后开机(选择数字编号1,回车) 3.输入“y”回车,程序自动安装 4.安装成功后如图 5.设置IP 6.绑定网卡 ...

  4. HTML&CSS基础-字体的样式

    HTML&CSS基础-字体的样式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTML源代码 <!DOCTYPE html> <html> & ...

  5. HTML&CSS基础-边框简写属性

    HTML&CSS基础-边框简写属性 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTML源代码 <!DOCTYPE html> <html> ...

  6. 16寸屏苹果MacBook Pro悄悄上市,售价18999 元起步

    传闻了半年之久的16寸屏苹果MacBook Pro于11月13日夜晚终于上线,15寸的机身16寸的屏幕,相比于此前的13寸和15寸MacBook Pro,新品搭配了更大的屏幕.更高性能的处理器以及更大 ...

  7. 配置数据源和配置jpa的yml文件

    spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root url: j ...

  8. Caused by: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。

    org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接. at org ...

  9. HDFS中的fsck命令(检查数据块是否健康)

    在HDFS中,提供了fsck命令,用于检查HDFS上文件和目录的健康状态.获取文件的block信息和位置信息等. 我们在master机器上执行hdfs fsck就可以看到这个命令的用法. [hadoo ...

  10. quiver()函数

    1.quiver函数 一般用于绘制二维矢量场图,函数调用方法如下: 1 quiver(x,y,u,v) 该函数展示了点(x,y)对应的的矢量(u,v).其中,x的长度要求等于u.v的列数,y的长度要求 ...