常用排序算法整理分享(快速排序算法、希尔排序)_C 语言

整理了几个排序算法,通过测试来看,最快的还是快速排序算法,简直不是一个数量级的速度。

复制代码 代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <time.h>
#include <unistd.h>

//一些排序算法整理
//插入排序算法
//直接插入排序
void
direct_insert_sort(int *a,int len)
{
 //思路:最后一个依次和前面的进行比较
 //将满足的条件的往后移动,当然是从头
 //开始且是从最小比较数组开始逐渐扩大
 //到整个数组
 int i,j,temp;
 for(i = 1;i < len;++i) {
  //获取最后一个索引数据
  temp = a[i];
  for(j = i - 1;j >= 0;--j) {
   //从倒数第二个开始
   if(a[j] > temp)//升序排列
    a[j + 1] = a[j];
   else
    break;//立刻退出
  }
  //将最后一个位置插入到合适的位置
  a[j + 1] = temp;
 }
}

//希尔排序
void
shell_insert_sort(int *a,int len)
{
 //思路:就是比直接插入排序多了层
 //循环,这层循环是用来控制步进按
 //照算法的本来思路是这样可以减少
 //交换次数
 int i,j,h,temp;
 for(h = len / 2;h > 0;h /= 2) {
  //内层其实本质还是直接插入
  //算法思路
  //注意下i += h和i++两者对算
  //法的影响
  for(i = h;i < len;i += h) {
   //获取最后一个索引的值
   temp = a[i];
   for(j = i - h;j >= 0;j -= h) {
    if(a[j] > temp)//升序排列
     a[j + h] = a[j];
    else
     break;
   }
   //将找到的位置插入最后一个索引
   a[j + h] = temp;
  }
 }
}

//选择排序
//冒泡排序
void
bubble_swap_sort(int *a,int len)
{
 //思路:从数组最后开始两两比较
 //将底层满足要求的数据逐渐交换
 //到上层,可能导致交换次数太多
 int i,j,temp;
 //如果一次冒泡中没有发生交换可
 //以认为此次排列已经结束
 bool exchange = false;
 for(i = 0;i < len - 1;++i) {
  for(j = len - 1;j > i;--j) {
   //满足条件的就进行交换
   if(a[j] < a[j - 1]) {
    temp = a[j];
    a[j] = a[j - 1];
    a[j - 1] = temp;
    exchange = true;
   }
  }
  if(exchange)
   exchange = false;
  else
   break;
 }
}

//快速排序
void
quick_swap_sort(int *a,int low,int high)
{
 //思路:从数组中找一个值
 //然后排列数组使其两边要
 //么大于要么小于这个值,
 //然后递归下去排序
 //优势在于每次找中间值可
 //以交换很多次。
 int _low,_high,qivot;
 if(low < high) {
  _low = low;
  _high = high;
  //这里从最后一个开始
  qivot = a[low];
  //找中间值的办法就是逐渐逼近
  //从头尾两端开始逼近,顺便也
  //排序了
  while(_low < _high) {
   //既然是从low开始,那么首先
   //就从high找小于qivot的(升
   //序排列)
   while(_low < _high && a[_high] > qivot)
    --_high;//逐渐向中间逼近
   if(_low < _high)//必然是找到了a[_high] > qivot的情况
    a[_low++] = a[_high];
   //这下a[_high]空出位置来了,所以从low找
   //比qivot大的数据
   while(_low < _high && a[_low] < qivot)
    --_low;//逼近中间
   if(_low < _high)
    a[_high--] = a[_low];
  }
  //最后_low == _high那么这个位置就是qivot的位置
  a[_low] = qivot;
  //递归下去
  quick_swap_sort(a,low,_high - 1);
  quick_swap_sort(a,_low + 1,high);
 }
}

//选择排序
//直接选择排序
void
direct_select_sort(int *a,int len)
{
 //思路:就是遍历数组找到极值
 //放到头或者尾,这样逐渐缩小
 //范围到最小比较数组
 int i,j,pos,temp;
 for(i = 0;i < len - 1;++i) {
  //从头开始获取一个值假设为极值
  pos = i;
  for(j = i + 1;j < len;++j) {
   //满足条件
   if(a[pos] > a[j])//升序
    pos = j;
  }
  if(pos != i) {
   //进行交换
   temp = a[pos];
   a[pos] = a[i];
   a[i] = temp;
  }
 }
}

void
disp(int *a,int len)
{
 int i = 0;
 for(;i < len;i++) {
  if(i != 0 && i % 16 == 0)
   printf("\n");
  printf(" %d",a[i]);
 }
 printf("\n");
}

#define TEST_ARRAY_LEN 100000
#define TEST_COUNT 1

int
main(int argc,char *argv[])
{
 //int a[] = {1,8,4,0,9,6,3,7,2,18,74,5,64,12,39};
 //int len = sizeof(a) / sizeof(a[0]);
 //direct_insert_sort(a,len);
 //shell_insert_sort(a,len);
 //bubble_swap_sort(a,len);
 //quick_swap_sort(a,0,len - 1);
 //direct_select_sort(a,len);
 disp(a,len);

 return 0;
}

时间: 2024-09-17 03:54:45

常用排序算法整理分享(快速排序算法、希尔排序)_C 语言的相关文章

C语言实现选择排序、冒泡排序和快速排序的代码示例_C 语言

选择和冒泡 #include<stdio.h> void maopao(int a[],int len){ int i,j,temp; for(i = 0;i < len - 1 ; i ++){//从第一个到倒数第二个 for (j = 0 ; j < len - 1 - i ; j ++)//排在后的是已经排序的 { if (a[j] > a[j + 1])//大的数换到后面去 { temp = a[j]; a[j] = a[j + 1]; a [j + 1] = tem

排序算法之一插入排序(直接插入和希尔排序)

本文的图均引用自http://blog.csdn.net/pzhtpf/article/details/7559896,代码为结合众家思想以及自己的方式而来. 下面是一些排序的关系图: 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]个数是排好序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好序的.如此反复循环,知道全部排好顺序.(2)实例: (3)代码实现: 123456789101112131415161718192021222324 /** *

java数组排序示例(冒泡排序、快速排序、希尔排序、选择排序)_java

快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来. 选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组. 插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序. 复制代码 代码如下: package com.firewolf.sort; public class MySort {  /**  * @param args  */ public

冒泡排序与选择排序的不同、快速排序与选择排序的结合

冒泡排序可以说是最简单的排序了.我们学习C语言循环的时候都会提到. 可见这是一种浅而易懂的排序算法! 但不见得这种算法就没用处.首先,他很容易理解,这样在各种教材中比较适合拿来"开门见山".其次是他很稳定. 若明确知道即将排的数字很混乱,随机性很强,则用冒泡排序也未偿不可. 谁让他始终是O(n^2)呢. 冒泡排序法代码:  1void BubbleSort(int a[],int l) 2{ 3    for(int i = 0; i< l;++i) 4    { 5      

C语言实现选择排序、直接插入排序、冒泡排序的示例_C 语言

选择排序选择排序是一种简单直观的排序算法,其核心思想是:遍历数组,从未排序的序列中找到最小元素,将其放到已排序序列的末尾. 时间复杂度:O(n^2) 稳定性 :不稳定 /* * @brief selection sort */ void selection_sort(int a[], int n) { int i, j, min, tmp; for (i = 0; i < n - 1; ++i) { min = i; for (j = i+1; j < n; ++j) { if (a[j] &

stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列)_C 语言

算法:用来处理群集内的元素.它们可以出于不同的目的而搜寻,排序,修改,使用那些元素.是一种应用在容器上以各种方法处理其内存的行为或功能,如sort(排序),copy(拷贝)- 算法由模板函数体现,这些函数不是容器类的成员函数,是独立的函数,它们可以用于STL容器,也可以用于普通的C++数组等. 头文件:#include<algorithm> 在STL的泛型算法中有4类基本的算法: 1)变序型队列算法: 可以改变容器内的数据: 2)非变序型队列算法:处理容器内的数据而不改变他们: 3)排序值算法

简单掌握桶排序算法及C++版的代码实现_C 语言

桶排序介绍桶排序(Bucket Sort)的原理很简单,它是将数组分到有限数量的桶子里. 假设待排序的数组a中共有N个整数,并且已知数组a中数据的范围[0, MAX).在桶排序时,创建容量为MAX的桶数组r,并将桶数组元素都初始化为0:将容量为MAX的桶数组中的每一个单元都看作一个"桶". 在排序时,逐个遍历数组a,将数组a的值,作为"桶数组r"的下标.当a中数据被读取时,就将桶的值加1.例如,读取到数组a[3]=5,则将r[5]的值+1. C++实现算法假设数据分

C语言压缩文件和用MD5算法校验文件完整性的实例教程_C 语言

使用lzma SDK对7z文件简单解压缩有时候我们只需要单纯对lzma算法压缩的7z文件进行解压,有时需要在嵌入式设备上解压,使用p7zip虽然支持多种格式,但是不容易裁剪,使用lzma SDK是首选: 可以在这里找到各种版本:http://zh.sourceforge.jp/projects/sfnet_sevenzip/releases/ 我下载了4.65版本,这个对文件名编码支持没有9.20的好,中文可能有问题,但是我的需求不需要支持中文文件名,所以足够用了. 解压后先看一下7z这个工程,

C语言kmp算法简单示例和实现原理探究_C 语言

以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下"奥,它是做模式匹配的"这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(下不说程序实现,思想很简单). 模式匹配的经典应用:从一个字符串中找到模式字串的位置.如"abcdef"中"cde"出现在原串第三个位置.从基础看起 朴素的模式匹配算法 A:abcdefg  B:cde 首先B从A的第一位开始比较,B++==A++,如果全