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

#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. JavaScript 继承 封装 多态实现及原理详解

    面向对象的三大特性 封装 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.封装是面向对象的特征之一,是对象和类概念的主要特性. ...

  2. orangepi获取cpu温度

    cat /sys/devices/virtual/hwmon/hwmon1/temp1_input

  3. SQL+C#:一次多语言混合编程的经验总结

    1.用JAVA做,采取轮询策略: 2.用sql语言+C#混合编程,采取触发策略

  4. golang读写文件的几种方式

    golang中处理文件有很多种方式,下面我们来看看. (1)使用os模块 先来看看如何查看文件属性 package main import ( "fmt" "os&quo ...

  5. PCM时序

    PCM(Pulse Code Modulation),脉冲编码调制,PCM总线用于传输数字语音信号,包括4根信号线:FSYNC(同步)/PCLK(时钟)/DTX(发送)/DRX(接收) PCM分为Ma ...

  6. openstack转移新建虚拟机存储路径

    在云计算openstack中以为新建的虚拟机都存放在/var/lib/nova/instances中,在新建虚拟机时内存当然不够用,所以可以将nova转移到新的存储位置 以下操作只在计算节点上进行 一 ...

  7. 微信小程序API---数据缓存

    本地数据缓存常用于存储多页面用到的数据,例如用户头像信息. (1)数据存储 wx.setStorage(Object object)与wx.setStorageSync(string key, any ...

  8. 51nod 2381 个人所得税

    牛牛已知每月的税前收入,他想知道在新个税下,税收后收入是多少?个税计算方法是这样的: 综合所得金额 - 新起征点5000元 = 应纳税所得额 其中 综合所得金额 就是税前收入,(你可以忽略五险一金,专 ...

  9. python算法与数据结构-插入排序算法(34)

    一.插入排序的介绍 插入排序的工作方式非常像人们排序一手扑克牌一样.开始时,我们的左手为空并且桌子上的牌面朝下.然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置.为了找到一张牌的正确位置,我 ...

  10. JDK源码那些事儿之DelayQueue

    作为阻塞队列的一员,DelayQueue(延迟队列)由于其特殊含义而使用在特定的场景之中,主要在于Delay这个词上,那么其内部是如何实现的呢?今天一起通过DelayQueue的源码来看一看其是如何完 ...