C语言排序算法(十种排序代码可跑)

  • 冒泡排序:
  • 选择排序:
  • 插入排序:
  • 归并排序:
  • 快速排序:
  • 希尔排序:
  • 堆排序:
  • 计数排序:
  • 桶排序:
  • 基数排序:
  • 以上就是所有代码,希望同学们好好学习!!!

冒泡排序:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10void bubble_sort(int k[], int n)
{int i, j, temp;for (i = 0; i < n - 1; i++)      //外循环表示比较n-1轮{for (j = 0; j < n-1-i; j++)     //内循环表示每轮比较结束后,最后一个值最大,每轮除去最后一个继续比较{if (k[j] > k[j+1]){temp = k[j];k[j] = k[j+1];k[j+1] = temp;}}}
}int main()
{int k[N];int i;srand((unsigned int)time(NULL));//获取随机数种子for(i=0;i<N;i++)k[i] = rand() % N;bubble_sort(k,N);for(i=0;i<N;i++)printf("%d ",k[i]);printf("\n");system("pause");   //可以实现冻结屏幕,便于观察程序的执行结果return 0;
}

选择排序:

#include<stdio.h>
#include<stdlib.h>void select(int k[], int n)
{int i, j, temp, min;for (i = 0; i < n - 1; i++)      //外循环表示选择n-1轮{min = i;for (j = i + 1; j < n; j++)     //内循环挑选最小的值,下标赋值给min{if (k[j] < k[min])min = j;}if (min != i){temp = k[i];k[i] = k[min];k[min] = temp;}}printf("\n");
}int main()
{int i, k[10] = { 2, 5, 7, 9, 0, 1, 2, 4, 3, 6 };select(k, 10);for (i = 0; i < 10; i++)printf("%d ", k[i]);system("pause");   //可以实现冻结屏幕,便于观察程序的执行结果return 0;
}

插入排序:

#include "stdio.h"void InsertSort(int a[], int n)  //直接插入排序
{int i,j,temp=0;for(i=1;i<n;i++){if(a[i]<a[i-1]){temp = a[i];for(j=i-1;j>=0 && a[j]>temp;j--){a[j+1]=a[j];}a[j+1]=temp; //}}}void main()
{int a[10]={0,6,67,34,56,45,12,4,7,49};int i=0;InsertSort(a,10);for(i=0;i<10;i++)printf("%d ",a[i]);}

归并排序:

#include <stdio.h>
#include <stdlib.h>
#define N 7void merge(int arr[], int low, int mid, int high){int i, k;int *tmp = (int *)malloc((high-low+1)*sizeof(int));//申请空间,使其大小为两个int left_low = low;int left_high = mid;int right_low = mid + 1;int right_high = high;for(k=0; left_low<=left_high && right_low<=right_high; k++){  // 比较两个指针所指向的元素if(arr[left_low]<=arr[right_low]){tmp[k] = arr[left_low++];}else{tmp[k] = arr[right_low++];}}if(left_low <= left_high){  //若第一个序列有剩余,直接复制出来粘到合并序列尾//memcpy(tmp+k, arr+left_low, (left_high-left_low+l)*sizeof(int));for(i=left_low;i<=left_high;i++)tmp[k++] = arr[i];}if(right_low <= right_high){//若第二个序列有剩余,直接复制出来粘到合并序列尾//memcpy(tmp+k, arr+right_low, (right_high-right_low+1)*sizeof(int));for(i=right_low; i<=right_high; i++)tmp[k++] = arr[i];}for(i=0; i<high-low+1; i++)arr[low+i] = tmp[i];free(tmp);return;
}void merge_sort(int arr[], unsigned int first, unsigned int last){int mid = 0;if(first<last){mid = (first+last)/2; /* 注意防止溢出 *//*mid = first/2 + last/2;*///mid = (first & last) + ((first ^ last) >> 1);merge_sort(arr, first, mid);merge_sort(arr, mid+1,last);merge(arr,first,mid,last);}return;
}int main(){int i;int a[N]={32,12,56,78,76,45,36};printf ("排序前 \n");for(i=0;i<N;i++)printf("%d\t",a[i]);merge_sort(a,0,N-1);  // 排序printf ("\n 排序后 \n");for(i=0;i<N;i++)printf("%d\t",a[i]); printf("\n");system("pause");return 0;
}

快速排序:

#include<stdlib.h>
#include<stdio.h>
#include<string.h>void PrintArray(int arr[], int len)
{int i;for (i = 0; i < len; i++)printf("%d ", arr[i]);printf("\n");
}void QuickSort(int arr[], int start, int end)
{int i = start, j = end;int temp = arr[start];  //基准数if (i < j){while (i < j){while (i<j && arr[j] >= temp)  //从右向左,找小于temp的{j--;}if (i < j)     //填坑{arr[i] = arr[j];i++;}while (i<j && arr[i] < temp)  //从左向右,找大于temp的{i++;}if (i < j)      //填坑{arr[j] = arr[i];j--;}}arr[i] = temp;                  //把基准数放到 i=j 位置QuickSort(arr, start, i - 1);   //左半部分快排 QuickSort(arr, i + 1, end);     //右半部分快排}
}int main(){int arr[10] = { 8, 6, 5, 7, 9, 0, 1, 2, 4, 3 };int len = sizeof(arr) / sizeof(int);PrintArray(arr, len);QuickSort(arr, 0, len - 1);PrintArray(arr, len);system("pause");return 0;}

希尔排序:

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<time.h>
#define N 10void PrintArray(int arr[], int len)
{int i;for ( i = 0; i < len; i++)printf("%d ", arr[i]);printf("\n");
}void ShellSort(int arr[], int len)
{int i, j, k, temp,increasement = len;do{increasement = increasement / 3 + 1;  //确定分的组数,最后组数为1for (i = 0; i < increasement; i++)     //遍历每组{for (j = i + increasement; j < len; j += increasement)  //每组分别进行插入排序{if (arr[j] < arr[j - increasement]){temp = arr[j];for (k = j - increasement; k >= 0 && arr[k] > temp; k -= increasement){arr[k + increasement] = arr[k];}arr[k + increasement] = temp;}}}} while (increasement > 1);
}int main()
{int arr[N];int i;srand((unsigned)time(NULL));for (i = 0; i < N; i++){arr[i] = rand() % N;      //得到0--N-1的随机数}PrintArray(arr, N);ShellSort(arr, N);PrintArray(arr, N);system("pause");return 0;
}

堆排序:

#include<stdlib.h>
#include<stdio.h>
#include<string.h>//打印函数
void PrintArray(int arr[], int len)
{int i;for (i = 0; i < len; i++)printf("%d ", arr[i]);printf("\n");
}//交换数组中的两个元素
void swap(int arr[], int a, int b)
{int temp = arr[a];arr[a] = arr[b];arr[b] = temp;
}void HeapAdjust(int arr[], int index, int len)
{//保存当前节点的下标int max = index;//保存左右孩子的下标int lchild = index * 2 + 1;int rchild = index * 2 + 2;if (lchild<len&&arr[lchild]>arr[max])max = lchild;if (rchild<len&&arr[rchild]>arr[max])max = rchild;if (max != index){//交换两个结点swap(arr, max, index);HeapAdjust(arr, max, len);}
}void HeapSort(int arr[], int len)
{int i;for (i = len / 2 - 1; i >=0 ; i--){//初始化堆HeapAdjust(arr, i, len);  //刚开始从下往上调整}//交换顶堆元素和最后一个元素for (i = len - 1; i >=0 ; i--){swap(arr, 0, i);HeapAdjust(arr, 0, i);   //从上往下调整}
}int main(){int arr[10] = { 8, 6, 5, 7, 9, 0, 1, 2, 4, 3 };int len = sizeof(arr) / sizeof(int);PrintArray(arr, len);//堆排序HeapSort(arr,len);PrintArray(arr, len);system("pause");return 0;
}

计数排序:

#include <stdio.h>
#include <stdlib.h>
#define random(x) rand()%(x)
#define NUM 100     // 产生100个随机数
#define MAXNUM 200     //待排序的数字范围是0-200
void countingSort(int A[], int n, int k){int *c, *b;int i;c = (int *)malloc(sizeof(int)*k);/*临时数组,注意它的大小是待排序序列中值最大的那个。如假定该排序序列中最大值为1000000,则该数组需要1000000*sizeof(int)个存储单元*/b = (int *)malloc(sizeof(int)*n);  /*存放排序结果的数组*/for (i = 0; i < k; i++)c[i] = 0;                       /*初始化*/for (i = 0; i < n; i++)c[A[i]] += 1;                   /*统计数组A中每个值为i的元素出现的次数*/for (i = 1; i < k; i++)c[i] = c[i - 1] + c[i];         /*确定值为i的元素在数组c中出现的位置*/for (i = n - 1; i >= 0; i--){b[c[A[i]] - 1] = A[i];       /*对A数组,从后向前确定每个元素所在的最终位置;*/c[A[i]] -= 1;}for (i = 0; i < n; i++)A[i] = b[i];                /*这个目的是返回A数组作为有序序列*/free(c);free(b);
}
void printArray(int A[], int n){int i = 0;for (i = 0; i < n; i++){printf("%4d", A[i]);}printf("\n");
}
/*测试*/
int main()
{int A[NUM];int i;for (i = 0; i < NUM; i++)A[i] = random(MAXNUM);printf("before sorting:\n");printArray(A, NUM);countingSort(A, NUM, MAXNUM);printf("after sorting:\n");printArray(A, NUM);return 0;
}

桶排序:

#include <stdio.h>
void main()
{int a[11],i,j,t;for(i=0;i<=10;i++){a[i]=0;//初始化为0}for(i=0;i<5;i++)//循环读入5个数{scanf("%d",&t);//把每一个数读到变量t中a[t]++;//进行计数}for(i=0;i<=10;i++)//依次判断a[0]~a[10]{for(j=0;j<a[i];j++)//出现了几次就打印几次{printf("%d",i);}}
}

基数排序:

#include<stdio.h>#define Max_ 10      //数组个数
#define RADIX_10 10    //整形排序
#define KEYNUM_31 10     //关键字个数,这里为整形位数// 打印结果
void Show(int  arr[], int n)
{int i;for ( i=0; i<n; i++ )printf("%d  ", arr[i]);printf("\n");
}// 找到num的从低到高的第pos位的数据
int GetNumInPos(int num,int pos)
{int temp = 1;int i;for (i = 0; i < pos - 1; i++)temp *= 10;return (num / temp) % 10;
}//基数排序  pDataArray 无序数组;iDataNum为无序数据个数
void RadixSort(int* pDataArray, int iDataNum)
{   int i,pos,j,k;
int *radixArrays[RADIX_10];    //分别为0~9的序列空间
for (i = 0; i < 10; i++)
{radixArrays[i] = (int *)malloc(sizeof(int) * (iDataNum + 1));radixArrays[i][0] = 0;    //index为0处记录这组数据的个数
}for (pos = 1; pos <= KEYNUM_31; pos++)    //从个位开始到31位
{for (i = 0; i < iDataNum; i++)    //分配过程{int num = GetNumInPos(pDataArray[i], pos);int index = ++radixArrays[num][0];radixArrays[num][index] = pDataArray[i];}for (i = 0, j =0; i < RADIX_10; i++)    //收集{for (k = 1; k <= radixArrays[i][0]; k++)pDataArray[j++] = radixArrays[i][k];radixArrays[i][0] = 0;    //复位}
}
}int main()
{   //测试数据int arr_test[Max_] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 };//排序前数组序列Show( arr_test, Max_ );RadixSort( arr_test, Max_);//排序后数组序列Show( arr_test, Max_ );return 0;
}

以上就是所有代码,希望同学们好好学习!!!

C语言排序算法(十种排序代码可跑相关推荐

  1. 动图图解C语言选择排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  2. C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序

    常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...

  3. 十大经典排序算法(附代码、动画及改进方案)

    前言说明 十大排序算法可以说是每个程序员最早接触的也是最重要的算法,这一块必须要非常熟练的掌握,应该要理解每种排序的思想,对各个排序的性能的了解也是基础且重要的.为了方便自己和大家学习,决定整合成一篇 ...

  4. JavaScript实现十种经典排序算法(js排序算法)

    冒泡排序算法 冒泡排序(Bubble Sort)是一种简单直观的排序算法.冒泡排序算法的步骤描述如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一 ...

  5. C语言基础排序算法-选择排序

    C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...

  6. python 代码排布_python实现经典排序算法的示例代码

    以下排序算法最终结果都默认为升序排列,实现简单,没有考虑特殊情况,实现仅表达了算法的基本思想. 冒泡排序 内层循环中相邻的元素被依次比较,内层循环第一次结束后会将最大的元素移到序列最右边,第二次结束后 ...

  7. python排序算法——希尔排序(附代码)

    python排序算法--希尔排序 文章目录 python排序算法--希尔排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序算法 ...

  8. 【数据结构】排序算法总结及代码实现

    我们通常说的排序算法指的是内部排序算法,即数据在内存中进行排序. 首先先来看一下我们学过的排序都有什么? 排序可以大的方面分为比较排序和非比较排序? 比较排序有: 1.冒泡排序 2.选择排序 3.插入 ...

  9. 排序算法猴子排序java算法代码实现

    <h1>猴子排序</h1> 原理:现有一组未排序数据和相同数量的方格,然后依次随机地取出数据随机地放入方格中,直到把方格放满即止. 之所以又被称为猴子排序,我的猜测是因为.将这 ...

  10. 八大排序算法总结Java代码实现(建议收藏后食用)

    目录 排序算法介绍 相关术语 排序的稳定性 排序分类 内排序与外排序 算法时间复杂度 度量一个程序(算法)执行时间的两种方法 时间频度 忽略常数项 忽略低次项 忽略系数 时间复杂度 常数阶O(1) 对 ...

最新文章

  1. Windows DPM 备份数据
  2. delphi 鼠标获取窗口句柄_Windows窗口自定义,只需WindowTop一键设置
  3. 15-垃圾回收相关算法
  4. cpu只能单通道是什么表现_【小白入门】为什么要组内存双通道?
  5. 阿里云Kubernetes CSI实践—NAS动态存储卷使用
  6. @codeforces - 553E@ Kyoya and Train
  7. javascript Arrow functions(箭头函数)
  8. 计算机科学技术考研内容,计算机科学技术考研考什么科目
  9. Android代码修改系统时间
  10. linux dm9000驱动分析,ARM-Linux驱动--DM9000网卡驱动分析(二)
  11. 手机WIFI传文件到局域网服务器,电脑和手机在同一局域网上,怎样无线传输文件? -电脑资料...
  12. amazon账号关联|我做了这些不在关联了
  13. console.log详解
  14. LeetCode算法题-镜面反射(Mirror Reflection)
  15. 小马哥 - ----高仿三星n9006 主板A202型号 拆机主板图 完美开机
  16. 【JavaWeb学习】—iframe标签(四)
  17. [Redux/Mobx] redux的数据存储和本地储存有什么区别?
  18. c++语言简易自动售货机,C++自动售货机源代码 课程设计
  19. 谷粒商城电商项目 高可用集群篇
  20. 虚拟机已经显示了已连接的图标但不能上网的解决办法+虚拟机显示网络连接激活失败

热门文章

  1. Vue粒子特效(vue-particles插件) 粒子星空图
  2. 大数据学习——之探索中国米其林餐厅
  3. 【计算机网络】HTTPS 协议详解
  4. 09 基于STM32智能甲醛浓度检测超限报警系统设计
  5. 实现 QQLive HD 界面的代码
  6. 医院院长电脑坏了,拿到一个大修理店去修。
  7. mysql数据库教程 外键_MySQL数据库外键
  8. 构建patch补丁并提交git和rpm软件包验证
  9. 5种方法防止 jsp被sql注入
  10. ONVIF 事件--订阅推送告警