C语言实现排序
//C语言版排序
#include<stdio.h>
#include<stdlib.h>
//冒泡排序
void bubleSort(int data[], int n);
//快速排序
void quickSort(int data[], int low, int high);
int findPos(int data[], int low, int high);
//插入排序
void bInsertSort(int data[], int n);
//希尔排序
void shellSort(int data[], int n);
//选择排序
void selectSort(int data[], int n);
//堆排序
void heapSort(int data[], int n);
void swap(int data[], int i, int j);
void heapAdjust(int data[], int i, int n);
//归并排序
void mergeSort(int data[], int first, int last);
void merge(int data[], int low, int mid, int high);
//基数排序
void radixSort(int data[], int n);
int getNumPos(int num, int pos); int main() {
int data[10] = {43, 65, 4, 23, 6, 98, 2, 65, 7, 79};
int i;
printf("原先数组:");
for(i=0;i<10;i++) {
printf("%d ", data[i]);
}
printf("\n");
/*printf("冒泡排序:");
bubleSort(data, 10);
for(i=0;i<10;i++) {
printf("%d ", data[i]);
}
printf("\n");
printf("快速排序:");
quickSort(data, 0, 9);
for(i=0;i<10;i++) {
printf("%d ", data[i]);
}
printf("\n");
printf("插入排序:");
bInsertSort(data,10);
for(i=0;i<10;i++) {
printf("%d ", data[i]);
}
printf("\n");
printf("希尔排序:");
shellSort(data, 10);
for(i=0;i<10;i++) {
printf("%d ", data[i]);
}
printf("\n");
printf("选择排序:");
selectSort(data, 10);
for(i=0;i<10;i++) {
printf("%d ", data[i]);
}
printf("\n");
int data[11] = {-1, 43, 65, 4, 23, 6, 98, 2, 65, 7, 79};
int i;
printf("原先数组:");
int data[11] = {-1, 43, 65, 4, 23, 6, 98, 2, 65, 7, 79};
for(i=1;i<11;i++) {
printf("%d ", data[i]);
}
printf("\n");
printf(" 堆排序:");
heapSort(data, 10);
for(i=1;i<11;i++) {
printf("%d ", data[i]);
}
printf("\n");
printf("归并排序:");
mergeSort(data, 0, 9);
for(i=0;i<10;i++) {
printf("%d ", data[i]);
}
printf("\n");*/
printf("基数排序:");
radixSort(data, 10);
for(i=0;i<10;i++) {
printf("%d ", data[i]);
}
printf("\n");
return 0;
} /*--------------------冒泡排序---------------------*/
void bubleSort(int data[], int n) {
int i,j,temp;
//两个for循环,每次取出一个元素跟数组的其他元素比较
//将最大的元素排到最后。
for(j=0;j<n-1;j++) {
//外循环一次,就排好一个数,并放在后面,
//所以比较前面n-j-1个元素即可
for(i=0;i<n-j-1;i++) {
if(data[i]>data[i+1]) {
temp = data[i];
data[i] = data[i+1];
data[i+1] = temp;
}
}
}
} /*--------------------快速排序---------------------*/
int findPos(int data[], int low, int high) {
//将大于t的元素赶到t的左边,大于t的元素赶到t的右边
int t = data[low];
while(low < high) {
while(low < high && data[high] >= t) {
high--;
}
data[low] = data[high];
while(low < high && data[low] <=t) {
low++;
}
data[high] = data[low];
}
data[low] = t;
//返回此时t在数组中的位置
return low;
}
//在数组中找一个元素,对大于该元素和小于该元素的两个数组进行再排序
//再对两个数组分为4个数组,再排序,直到最后每组只剩下一个元素为止
void quickSort(int data[], int low, int high) {
if(low > high) {
return;
}
int pos = findPos(data, low, high);
quickSort(data, low, pos-1);
quickSort(data, pos+1, high);
} /*--------------------插入排序---------------------*/
void bInsertSort(int data[], int n) {
int low,high,mid;
int temp,i,j;
for(i=1;i<n;i++) {
low = 0;
//把data[i]元素插入到它的前面data[0-(i-1)]中
temp =data[i];
high = i-1;
//该while是折半,缩小data[i]的范围(优化手段)
while(low <= high) {
mid = (low+high)/2;
if(data[mid] > temp) {
high = mid-1;
}
else {
low = mid+1;
}
}
int j = i;
//让data与已经排序好的数组的各个元素比较,小的放前面
while((j > low) && data[j-1] > temp) {
data[j] = data[j-1];
--j;
}
data[low] = temp;
}
} /*--------------------希尔排序---------------------*/
void shellSort(int * data, int n) {
int step,i,j,key;
//将数组按照step分组,不断二分到每组只剩下一个元素
for(step=n/2;step>0;step/=2) {
//将每组中的元素排序,小的在前
for(i=step;i<n;i++) {
key = data[i];
for(j=i-step;j>=0 && key<data[j];j-=step) {
data[j+step] = data[j];
}
//和上面的for循环一起,将组中小的元素换到数组的前面
data[j+step] = key;
}
}
} /*--------------------选择排序---------------------*/
void selectSort(int data[], int n) {
int i,j,mix,temp;
//每次循环数组,找出最小的元素,放在前面,前面的即为排序好的
for(i=0;i<n-1;i++) {
//假设最小元素的下标
int mix = i;
//将上面假设的最小元素与数组比较,交换出最小的元素的下标
for(j=i+1;j<n;j++) {
if(data[j] < data[mix]) {
mix = j;
}
}
//若数组中真的有比假设的元素还小,就交换
if(i != mix) {
temp = data[i];
data[i] = data[mix];
data[mix] = temp;
}
}
} /*--------------------堆排序---------------------*/
//堆排序将数组先组成二叉树,默认从数组的data[1]开始排,data[0]是
//无效数据
void heapSort(int data[], int n) {
int i;
//先将数组组成一棵完全二叉树
//从2/n开始,就是从倒数第二排结点往前开始
for(i=n/2;i>0;i--) {
heapAdjust(data, i, n);
}
//循环每个结点,将大的结点交换到堆顶
for(i=n;i>1;i--) {
swap(data, 1, i);
//每次交换完都要调整二叉树,将剩下的最大的结点交换到堆顶
heapAdjust(data, 1, i-1);
}
}
//交换函数
void swap(int data[], int i, int j) {
int temp;
temp = data[i];
data[i] = data[j];
data[j] = temp;
}
void heapAdjust(int data[], int i, int n) {
int j, temp;
//假设第一个结点的元素是最大的
temp = data[i];
//i结点:2*i是i结点的左结点,2*i+1是i结点的右结点
//把结点元素大的交换到前面
for(j=2*i;j<=n;j*=2) {
if(j < n && data[j] < data[j+1]) {
j++;
}
if(temp >= data[j]) {
break;
}
data[i] = data[j];
i = j;
}
data[i] = temp;
} /*--------------------归并排序---------------------*/
void mergeSort(int data[], int first, int last) {
int mid = 0;
//将数组不停的二分分组再组合,直到每组只剩一个元素
if(first < last) {
mid = (first+last)/2;
mergeSort(data, first, mid);
mergeSort(data, mid+1, last);
merge(data, first, mid, last);
}
return;
}
void merge(int data[], int low, int mid, int high) {
int i, k;
//定义一个临时数组存放传进来的无序数组排好序之后的数组
int *temp = (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(data[left_low]<=data[right_low]) {
temp[k] = data[left_low++];
}
else{
temp[k] = data[right_low++];
}
}
//左序列如果有剩下元素未排序,加到临时数组的末尾
if(left_low <= left_high) {
for(i=left_low;i<=left_high;i++) {
temp[k++] = data[i];
}
}
//右序列如果有剩下元素未排序,加到临时数组的末尾
if(right_low <= right_high) {
for(i=right_low;i<=right_high;i++) {
temp[k++] = data[i];
}
}
//将排好序的小分组转移到原数组中
for(i=0;i<high-low+1;i++) {
data[low+i] = temp[i];
}
free(temp);
return;
}
/*--------------------基数排序---------------------*/
//该函数的作用是找出num的pos位数的数字(比如:23的个位数数字是3)
int getNumPos(int num, int pos) {
int i;
int temp = 1;
for(i=0;i<pos-1;i++) {
temp *= 10;
}
return (num / temp) % 10;
}
void radixSort(int data[], int n) {
int i,j,k,pos,num,index;
//这几句话是创建一个从0-9(行)× (n+1)(列)的网格,第一列从上往下是0-9,
//第二列是该行包含的元素个数,默认为0个
int *radixArrays[10];
for(i=0;i<10;i++) {
radixArrays[i] = (int *)malloc(sizeof(int) * (n+1));
radixArrays[i][0] = 0;
}
//pos最大为31为数,计算机能承受的最大范围了
for(pos=1;pos<=31;pos++) {
//该for循环是将数组的元素按照位数(pos)的值放进网格内
for(i=0;i<n;i++) {
num = getNumPos(data[i], pos);
index = ++radixArrays[num][0];
radixArrays[num][index] = data[i];
}
//该for循环是将上面的for循环已经按照某个位数(pos)排列好的元素存入数组
for(i=0,j=0;i<10;i++) {
for(k=1;k<=radixArrays[i][0];k++) {
data[j++] = radixArrays[i][k];
}
//清空网格,以便给下个位数排列
radixArrays[i][0] = 0;
}
}
}
以上排序算法的优劣(时间复杂度和空间复杂度对比):
希望你们好好学C,期末取得好成绩 zhangsiman lizhiyuan wangying
C语言实现排序的更多相关文章
- 帮初学者改代码——有多少青春可以挥霍之“c语言 多重排序”
原文:“c语言 多重排序” 原代码: #include<stdio.h> #include<string.h> struct A { char name[100]; int g ...
- go语言的排序和去重
go语言的排序: https://blog.csdn.net/u010983881/article/details/52460998 go语言去重: https://blog.csdn.net/qq_ ...
- go语言的排序和搜索(转载)
http://studygolang.com/articles/1598 go语言的排序和搜索 晚上准备动手写点 go 的程序的时候,想起 go 如何排序的问题.排序 sort 是个基本的操作,当然搜 ...
- GO语言练习:第一个Go语言工程--排序
1.代码 2.编译 3.运行 1.代码框架 /home/fengbo/sorter $ tree . ├── bin ├── pkg ├── readme.txt └── src ├── algori ...
- C语言常用排序全解(转)
目的:重温经典排序思想,并用C语言指针实现排序算法================================================*/ /*====================== ...
- linux / centos 安装SQL Server 2017 设置默认语言与排序规则Chinese_PRC_CI_AS
安装 安装很简单参照官方教程 https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-red-hat?view=sq ...
- go语言的排序、结构体排序
原文:https://studygolang.com/articles/1598 晚上准备动手写点 go 的程序的时候,想起 go 如何排序的问题.排序 sort 是个基本的操作,当然搜索 searc ...
- [python学习] 语言基础—排序函数(sort()、sorted()、argsort()函数)
python的内建排序函数有 sort.sorted两个. 1.基础的序列升序排序直接调用sorted()方法即可 ls = list([5, 2, 3, 1, 4]) new_ls = sorted ...
- c语言选择排序
简单选择排序是经常用到的一种排序算法. 原理: 1.简单选择排序一句话概括:每次选择无序数列中最小的将其放在有序数列的最后. 2.在简单选择排序中,我们用初始化的数字int a[6]={2,5,6,3 ...
随机推荐
- Flask框架 之 路由和视图详解
路由+视图 我们之前了解了路由系统是由带参数的装饰器完成的. 路由本质:装饰器和闭包实现的. 路由设置的两种方式 来看个例子. @app.route('/index') def index(): re ...
- HTTP Debugger Pro安装教程
相关链接:HTTP Debugger Pro使用教程 安装步骤: 1.解压压缩包 2.双击运行安装文件 3.根据向导提示点击Next 4.选择接受协议,点击Next 5.选择高级模 ...
- Java WEB中的HttpServletResponse数据传递
1.什么是HttpServletResponse 2.使用HttpServletResponse向浏览器发送数据及相关实例. 实例1:实现文件下载功能 实例2:实现验证码注册 实例3:实现页面3秒后跳 ...
- Java 5新特性 for each 和Iterator的选择
在使用一边做迭代操作一边做删除数组元素操作是应该使用Iterator package for_each_And_Iterator; public class Commodity { private S ...
- Java 核心类库之反射机制
1:什么是反射机制? 2:反射机制它可以做什么呢? 3:反射机制对应的API又是什么? 1):通过反射机制来获取一个对象的全限定名称(完整包名),和类名: 2):实例化Class对象 3):获取对象的 ...
- 编写高质量代码改善C#程序的157个建议——建议4: TryParse比Parse好
建议4: TryParse比Parse好 如果注意观察除string外的所有基元类型,会发现它们都有两个将字符串转型为本身的方法:Parse和TryParse.以类型double为例,这两个方法最简单 ...
- MongoDB整理笔记の进程控制
查看活动进程 > db.currentOp(); > // 等同于: db.$cmd.sys.inprog.findOne() { inprog: [ { "opid" ...
- HTML5 Canvas核心技术图形动画与游戏开发 ((美)David Geary) 中文PDF扫描版
<html5 canvas核心技术:图形.动画与游戏开发>是html5 canvas领域的标杆之作,也是迄今为止该领域内容最为全面和深入的著作之一,是公认的权威经典.amazon五星级超级 ...
- 【转】.net 在线播放各类视频
原文地址:http://blog.csdn.net/hefeng_aspnet/article/details/9704857 一.后台拼字符串动态加载写法 前台调用代码 <!DOCTYPE h ...
- ipmitool批量添加新用户名和密码
Intelligent Platform Management Interface 需求:已知BMC帐号id2为root管理员帐号,添加id5bmc帐号 工具:ipmitool version 1.8 ...