C语言冒泡排序法代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言冒泡排序法代码相关的知识,希望对你有一定的参考价值。

冒泡排序每一趟排序把最大的放在最右边。

比如:

87 12 56 45 78

87和12交换:12 87 56 45 78

87和56交换:   56 87 45 78

87和45交换:      45 87 78

87和78交换:         78 87

到此第一趟排序结束,接下来的每一趟排序都是这样。

#include<stdio.h>
void Print(int *num, int n)

    int i;
    for(i = 0; i < n; i++)
        printf("%d ", num[i]);
    puts("\\n");
    return;

void Bubble_Sort(int *num, int n)

    int i, j;
    for(i = 0; i < n; i++)
    
        for(j = 0; i + j < n - 1; j++)
        
            if(num[j] > num[j + 1])
            
                int temp = num[j];
                num[j] = num[j + 1];
                num[j + 1] = temp;
            
            Print(num, n);
        
    
    return;

int main()

    int num[8] = 87, 12, 56, 45, 78;
    Bubble_Sort(num, 5);
    return 0;

参考技术A

程序如下:

# include <malloc.h>
# include <stdio.h>
int main(void)

    int i, j, t,num;
int * p;

printf("请输入要排序的数的个数:num=");
scanf("%d", &num);
p= (int *)malloc(num* sizeof(int));

//输入要排序的数
for (i=0; i<num; ++i)

printf("请输入第%d个要排序的数p[%d]=\\n", i+1,i);
scanf("%d", &p[i]);


//冒泡排序
for (i=0; i<num-1; ++i)

for (j=0; j<num-1-i; ++j)

if (p[j] > p[j+1])  // >表示升序 <表示降序

t = p[j];
p[j] = p[j+1];
p[j+1] = t; 




//输出已经排序好的数
printf("输出已经排序好的数");
    for (i=0; i<num; ++i)

printf("%d ", p[i]);

printf("\\n");

return 0;

程序运行结果:

随机输入十个数:

参考技术B 楼上的诸位童鞋,你们能看全楼主的需求在回答问题吗?
1楼的代码没有满足要求中的第二条
3楼的代码没有满足要求中的第二条和提示中的第一条
4楼的代码单从面向对象的角度来说基本满足了“高内聚低耦合”但是你看楼主的需求了吗?所问非所答。。。

另外楼主是初学者,就得考虑环境变量是否配置正确
环境变量配置
用鼠标右击“我的电脑”->属性->高级->环境变量
系统变量->新建->变量名:JAVA_HOME 变量值:D:\Program Files\Java\jdk1.6.0_12(这只是我的JDK安装路径)
系统变量->编辑->变量名:Path 在变量值的最前面加上:%JAVA_HOME%\bin;(若已经有Path项,无须另外新建,直接在后

面加,但需用;与前面已有的项分隔开)
系统变量->新建->变量名:CLASSPATH 变量值:
.;%java_home%\lib\dt.jar;%java_home%\lib\tools.jar;%java_home%\jre\lib\rt.jar

1.配置无误后将如下代码保存名为MaoPaoSort.java的文件置于D盘根目录下(别忘了把你的名字班级学号加到代码中,我已注明替换位置)
2.在命令行中中进入D盘下
3.输入 javac MaoPaoSort.java 回车
4.输入 java MaoPaoSort 2 4 3 9 14 10 (数字参数可以随意输入个数,以空格分隔开)回车
5.输出排序结果以及本人的名字、班级和学号信息
如果上一步输入有误如 java MaoPaoSort 9 a B 之类运行后则显示错误提示信息

我在1楼代码的基础上做出了如下修正
public class MaoPaoSort
public static void main(String[] args)
try
int mp[] = new int[args.length];
for (int i = 0; i < args.length; i++)
mp[i] = Integer.parseInt(args[i]);

for (int i = 0; i < mp.length; i++)
for (int j = 0; j < mp.length; j++)
int temp;
if (mp[i] < mp[j])
temp = mp[j];
mp[j] = mp[i];
mp[i] = temp;



for (int i = 0; i < mp.length; i++)
System.out.print(mp[i] + " ");

System.out.print("\n");
System.out.println("你的名字写在这里");
System.out.println("你的班级写在这里");
System.out.println("你的学号写在这里");
catch (Exception e)
System.out.println("没有传递参数或者参数类型不正确!请按照规则输入参数!程序退出...");




如果还有不明白的地方请继续追问,希望能对你有所帮助!
参考技术C 你好!很高兴能帮到你。
由于你刚学Java,所以一些编程规范是需要注意的,而我提供给你的答案看起来虽然有点复杂,不过采用了面向对象的编程思想,尽量做到低耦合高内聚,同时冒泡算法也做了升级,为冒泡的高级快速排序算法,不过为了对比,也保存了传统的冒泡算法。
需要讲解一下,算法本身不难,难在如何做到编程规范、以及方便修改、易于修改、使得程序灵活、低耦合高内聚。
算法部分请看Bubble类,里面有两种算法,有注释。
主类为TestBubble,主要用于调用Bubble对象运行算法、StuInfo对象提供学生作者信息、Info对象提供运行过程中提示信息。
运行结果如下(Bubble类为核心算法类):
************************************
run:
请输入您将要输入整数的个数:
10
请输入一串数字进行冒泡排序,注意:每次只输入一个,输完则回车
1:10
2:23
3:11
4:56
5:45
6:26
7:59
8:28
9:84
10:79
初始序列的数组为:
10 23 11 56 45 26 59 28 84 79
学号:200815009* 班级:08软件3班 姓名:叶科良
排序好的数组为:
10 11 23 26 28 45 56 59 79 84

源代码如下:
***************************************************
package testBubble;

import java.io.Reader;
import java.util.Scanner;

/**
*
* @author yekeliang
*/
public class TestBubble

private CommandLineBubbleRunner commandLineBubbleRunner;
private int arraySize;
private int[] intArray;
private StuInfo stuInfo;
private Info info;

/**
* 测试方法
* @param args
*/
public static void main(String[] args)
TestBubble test = new TestBubble();


/**
* 构造方法
* 调用初始化学生数据、接收命令行整数、展示结果3个成员方法
*/
public TestBubble()
initMemb();
initData();
runBubble();
showResult(this.getIntArray());


/**
* 初始化学生数据
*/
private void initData()
stuInfo.setStuNum("200815009*");
stuInfo.setStuClass("08软件3班");
stuInfo.setStuName("叶科良");
info.setInputIntNumInfo("请输入您将要输入整数的个数:");
info.setInputIntInfo("请输入一串数字进行冒泡排序,注意:每次只输入一个,输完则回车");
info.setShowInputInfo("初始序列的数组为:");
info.setShowResultInfo("排序好的数组为:");
info.setInputErrorInfo("对不起,输入有误!请输入整数.");


/**
* 接收命令行整数,使用冒泡算法
*/
private void runBubble()
try
System.out.println(info.getInputIntNumInfo());
setArraySize(getCommandLineBubbleRunner().getArraySize());
System.out.println(info.getInputIntInfo());
setIntArray(getCommandLineBubbleRunner().getAcceptAsIntArray(getArraySize()));
System.out.println(info.getShowInputInfo());
getCommandLineBubbleRunner().showAcceptAsIntArray(getIntArray());
Bubble.quick(getIntArray());
catch(java.util.InputMismatchException e)
System.out.println(info.getInputErrorInfo());



/**
* 展示结果
*/
private void showResult(int intArray[])
System.out.println("\n" + stuInfo.toString());
System.out.println(info.getShowResultInfo());
for (int i = 0; i < intArray.length; i++)
System.out.print(intArray[i] + " ");



private void initMemb()
stuInfo = new StuInfo();
info = new Info();
commandLineBubbleRunner = new CommandLineBubbleRunner();


public CommandLineBubbleRunner getCommandLineBubbleRunner()
return commandLineBubbleRunner;


public void setCommandLineBubbleRunner(CommandLineBubbleRunner commandLineBubbleRunner)
this.commandLineBubbleRunner = commandLineBubbleRunner;


public int getArraySize()
return arraySize;


public void setArraySize(int arraySize)
this.arraySize = arraySize;


public int[] getIntArray()
return intArray;


public void setIntArray(int[] intArray)
this.intArray = intArray;


private void getStuInfo()



/**
*
* @author 叶科良
*/
class CommandLineBubbleRunner

public int num;//输入整数个数

/**
* 从命令行中读取需要输入的整数个数
* @return 需要输入的整数个数
*/
public int getArraySize()
Scanner reader1 = new Scanner(System.in);
num = reader1.nextInt();
return num;


/**
* 指定数组大小,从命令行接收整数
* @param arraySize 数组大小
* @return 原始整数数组
*/
public int[] getAcceptAsIntArray(int arraySize)
int[] acceptArray = new int[arraySize];
Scanner reader = new Scanner(System.in);
for (int i = 0; i < getNum(); i++)
System.out.print((i + 1) + ":");
acceptArray[i] = reader.nextInt();

return acceptArray;


/**
* 打印原始输入数据
* @param intArray
*/
public void showAcceptAsIntArray(int[] intArray)
for (int i = 0; i < getNum(); i++)
System.out.print(intArray[i] + " ");



/**
* 取得数组大小
* @return
*/
public int getNum()
return num;




class Bubble

/**
* 给定一个数组,使用冒泡算法进行排序
* @param acceptArray 给定的一个数组
* @return 排序好的数组
*/
public static int[] getResultAsIntArray(int[] acceptArray)
int i, temp;
for (i = 0; i < (acceptArray.length - 1); i++) //两两进行比较,符合条件的进行交换
if (acceptArray[i] > acceptArray[i + 1])
temp = acceptArray[i];
acceptArray[i] = acceptArray[i + 1];
acceptArray[i + 1] = temp;


return acceptArray;


/**
* 快速冒泡排序算法
* @param r 输入的整数数组
* @param first 数组第一个下标
* @param end 数组最后一个下标
* @return 排好序的整数数组
*/
public static int partition(int[] r, int first, int end)
int i, j;
i = first;
j = end;
while (i < j)
while (i < j && r[i] <= r[j])
j--;

if (i < j)
int temp;
temp = r[i];
r[i] = r[j];
r[j] = temp;


return i;


public static void quick(int[] r, int first, int end) //利用递归反复划分
if (first < end)
int pivot = partition(r, first, end); //调用划分函数
quick(r, first, pivot - 1);
quick(r, pivot + 1, end);



public static int[] quick(int[] r)
quick(r,0,r.length-1);
return r;




class Info

private String inputIntNumInfo;//提示用户输入整数个数的消息语句
private String inputIntInfo;//提示用户输入整数的消息语句
private String showInputInfo;//提示显示用户输入整数的消息语句
private String inputErrorInfo;//提示用户输入有误消息语句
private String showResultInfo;//提示显示排序结果

public String getInputIntNumInfo()
return inputIntNumInfo;


public void setInputIntNumInfo(String inputIntNumInfo)
this.inputIntNumInfo = inputIntNumInfo;


public String getInputIntInfo()
return inputIntInfo;


public void setInputIntInfo(String inputIntInfo)
this.inputIntInfo = inputIntInfo;


public String getShowInputInfo()
return showInputInfo;


public void setShowInputInfo(String showInputInfo)
this.showInputInfo = showInputInfo;


public String getInputErrorInfo()
return inputErrorInfo;


public void setInputErrorInfo(String inputErrorInfo)
this.inputErrorInfo = inputErrorInfo;


public String getShowResultInfo()
return showResultInfo;


public void setShowResultInfo(String showResultInfo)
this.showResultInfo = showResultInfo;



class StuInfo

private String stuNum;//学生学号
private String stuName;//学生姓名
private String stuClass;//学生班级

@Override
public String toString()
return "学号:" + getStuNum() + " 班级:" + getStuClass() + " 姓名:" + getStuName();


public String getStuNum()
return stuNum;


public void setStuNum(String stuNum)
this.stuNum = stuNum;


public String getStuName()
return stuName;


public void setStuName(String stuName)
this.stuName = stuName;


public String getStuClass()
return stuClass;


public void setStuClass(String stuClass)
this.stuClass = stuClass;


参考技术D

冒泡排序是排序算法的一种,思路清晰,代码简洁,常被用在大学生计算机课程中。“冒泡”这个名字的由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。这里以从小到大排序为例进行讲解。基本思想及举例说明


冒泡排序的基本思想就是不断比较相邻的两个数,让较大的元素不断地往后移。经过一轮比较就,选出最大的数;经过第2轮比较,就选出次大的数,以此类推。下面以对 3 2 4 1 进行冒泡排序说明。

1.这个算法用rand函数产生新的要排序的数据,与已有的有序数列中的数据依次比较,如果遇到比他大的数据,就从该数据开始,一直交换到末尾,达到一个插入的效果。从而形成有序的数列。

2.此外,只用rand函数并不能达到真正随机的效果。如果要实现真正随机的效果,还要配合srand函数才行。

3.具体代码如下:#include "stdio.h"#include "stdlib.h"void main()int a[10],temp,r; printf("请输入一个种子\\n"); scanf("%d",&r);srand(r); for(int i=0;i<9;i++) 。

C语言——冒泡排序法

冒泡排序法

冒泡

C语言——冒泡排序法
C语言——冒泡排序法


     

简介

   冒泡排序Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。



0 1
第一趟排序

从最简单开始,首先我们创建一个数组,该数组有5位数字:

C语言——冒泡排序法

下面我们根据算法的描述来进行代码验算(第一趟排序):

C语言——冒泡排序法

C语言——冒泡排序法


排序~

    如果前一位的数比后一位的数要大,那么就交换,直到将数组的所有元素都比较了一遍!

   经过我们第一趟比较,我们可以发现:最大的值就在数组的末尾啦!


C语言——冒泡排序法


0 2
第二趟排序

第二趟~

     第二趟排序跟第一趟排序一样,也是用前一位与后一位比较,如果前一位比后一位要大,那就交换。值得注意的是:并不需要与最后一位比较了,因为在第一趟排序完了,最后一位已经是最大的数了。同理,我们第二趟排序完了之后,倒数第二位也是第二大的数了。


第二趟排序的代码如下:

C语言——冒泡排序法


结果:我们的第二大数已经排在了倒数第二位了!

C语言——冒泡排序法


0 3
代码简化

第三步~

    值得说明的是:上面的结果看起来已经是排序好的了,其实是我在测试时数据还不足够乱,如果数据足够乱的话,是需要4(n-1)趟排序的!

   但我们从上面的代码就可以发现:第一趟和第二趟的比较、交换代码都是重复的,并且我们的比较都是写死的(0,1,2,3,4),并不通用!

我们的数组有5位数字

第一趟需要比较4次

第二趟需要比较3次

我们可以根据上面规律推断出:

第三趟需要比较2次

第四趟需要比较1次

    再从上面的规律可以总结出:5位数的数组需要4躺排序的,每躺排序之后次数减1(因为前一趟已经把前一趟数的最大值确定下来了)!

     于是我们可以根据for循环和变量将上面的代码进行简化:


C语言——冒泡排序法


0 4
冒泡排序优化


在优化~

    从上面的例子我们可以看出来,如果数据足够乱的情况下是需要经过4趟比较才能将数组完整排好序。但是我们在第二趟比较后就已经得到排好序的数组了。     但是,我们的程序在第二趟排序后仍会执行第三趟、第四趟排序。这是没有必要的,因此我们可以对其进行优化一下:

    如果在某趟排序中没有发生交换位置,那么我们可以认为该数组已经排好序了。

    这也不难理解,因为我们每趟排序的目的就是将当前趟最大的数置换到对应的位置上,没有发生置换说明就已经排好序了。


代码如下:

C语言——冒泡排序法

C语言——冒泡排序法


0 5
个人建议


推荐两个视频学习网站

慕课网

  第一个推荐的学习网站应该是慕课网,在我初学的时候,这个网站对我的帮助挺大的,里面有很多免费的课程,也有很多付费的课程。如果你没有特殊的需求,一般免费课程就够自己学的了。

哔哩哔哩

    想不到弹幕追番/原创视频小站也被推荐了吧!不得不说哔哩哔哩上面的学习资源还是很多的,现在有很多年轻人都在上面学习呢!哈哈哈 大部分年轻人最爱的小破站可是受到过央视表扬的。被誉为年轻人学习的首要阵地,哔哩哔哩干杯!

06
总结

知道要学什么之后,如何去学呢?

每个知识点可以考虑这样去入手:

官网(大概率是英文,不推荐初学者看)。

书籍(知识更加系统完全,推荐)。

视频(比较容易理解,推荐,特别是初学的时候。慕课网和哔哩哔哩上面有挺多学习视频可以看,只直接在上面搜索关键词就可以了)。

网上博客(解决某一知识点的问题的时候可以看看)。

这里给大家一个建议,看视频的过程中最好跟着一起练,要做笔记!!!

最好可以边看视频边找一本书籍看,看视频没弄懂的知识点一定要尽快解决,如何解决?

首先百度/Google,通过搜索引擎解决不了的话就找身边的朋友或者认识的一些人。另外,一定要进行项目实战!很多人这时候就会问没有实际项目让我做怎么办?我觉得可以通过下面这几种方式:

C语言——冒泡排序法
  1. 在网上找一个符合自己能力与找工作需求的实战项目视频或者博客跟着老师一起做。做的过程中,你要有自己的思考,不要浅尝辄止,对于很多知识点,别人的讲解可能只是满足项目就够了,你自己想多点知识的话,对于重要的知识点就要自己学会去往深处学。

  2. Github或者码云上面有很多实战类别项目,你可以选择一个来研究,为了让自己对这个项目更加理解,在理解原有代码的基础上,你可以对原有项目进行改进或者增加功能。

  3. 自己动手去做一个自己想完成的东西,遇到不会的东西就临时去学,现学现卖(这种方式比较难,初学不推荐用这种方式,因为你脑海中没有基本的概念,写出来的代码一般会很难或者根本就做不出来一个像样的东西)。

C语言——冒泡排序法


   划重点——做项目不光要做,还要改进,改善。另外,如果你的老师有相关 Java 后台项目的话,你也可以主动申请参与进来。

  一定要学会分配自己时间,要学的东西很多,真的很多,搞清楚哪些东西是重点,哪些东西仅仅了解就够了。一定不要把精力都花在了学各种框架上,算法和数据结构真的很重要!


"
今天的分享就到这里啦~祝大家圣诞节快乐噢 Merry Christmas!!
"
智链IT Club

解决30万

长安国际大学城学生

学习中的各种疑难杂症!关注我,准没错!







以上是关于C语言冒泡排序法代码的主要内容,如果未能解决你的问题,请参考以下文章

c语言冒泡排序法代码一直排序错误,有时只能排前两个,不明白原因,请问究竟哪里写错了,谢谢!

冒泡排序法

C语言冒泡排序法

C语言——如何有效记忆冒泡排序法?

C语言——冒泡排序法

二级C语言排序技术2