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;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-10-22

程序如下:

# 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;
}

程序运行结果:

随机输入十个数:

第2个回答  2011-09-22
楼上的诸位童鞋,你们能看全楼主的需求在回答问题吗?
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("没有传递参数或者参数类型不正确!请按照规则输入参数!程序退出...");
}
}
}

如果还有不明白的地方请继续追问,希望能对你有所帮助!
第3个回答  2011-09-21
你好!很高兴能帮到你。
由于你刚学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;
}

}
第4个回答  推荐于2019-11-04

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


冒泡排序的基本思想就是不断比较相邻的两个数,让较大的元素不断地往后移。经过一轮比较就,选出最大的数;经过第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++) 。

本回答被网友采纳