数据结构 排序(冒泡排序升级版)

//排序--冒泡排序法升级版
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

/*
冒泡排序:
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的数列,一次比较相邻的两个元素,如果他们的顺序错误就把他们交换过来。
走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

*/

//冒泡法排序
void BubbleSort(int * arr, int num){
    if (arr == NULL)
    {
        printf("传入参数不可以为空!\n");
        return;
    }
    int i = 0, j = 0, exchange = 1, temp = 0;
    /*
      升级版的精华所在,增加exchange变量
      普通的冒泡排序需要遍历n轮,但是有可能n-1轮时候就已经排序完成了(部分数据本来有序),但是程序仍然会执行

      升级版增加exchange变量,当判断在一轮排序中,任何2个元素都没有交换位置 说明该数组已经有序
    */
    for (i = 0; i < num&& exchange; i++)
    {
        exchange = 0;
        for (j = 0; (j<num - i - 1) ; j++)
        {
            if (arr[j]>arr[j+1])
            {
                //交换位置
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                exchange = 1;
            }
        }
    }
}

//打印数组
void Print(int * arr, int num){
    if (arr == NULL)
    {
        printf("传入参数不可以为空!\n");
        return;
    }
    int i = 0;
    for (int i = 0; i < num; i++)
    {
        printf("%5d", *(arr + i));
    }
    printf("\n");
}

void Test(){
    int i = 0;
    int arr[10] = { 0 };
    //定义时间类型变量
    time_t ts;
    //生成随机数种子
    srand((unsigned int)time(&ts));
    for (i = 0; i < 10; i++)
    {
        arr[i] = (int)(rand() % 100);
    }
    //打印数组
    printf("\n原始数据----\n");
    Print(arr, 10);
    //冒泡法排序
    printf("冒泡法排序之后的数据\n");
    BubbleSort(arr, 10);
    Print(arr, 10);
}

void main(){
    Test();
    system("pause");
}

时间: 2024-11-05 18:28:01

数据结构 排序(冒泡排序升级版)的相关文章

数据结构——排序——冒泡排序算法

冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 冒泡排序对n个项目需要O(n2)的比较次数,且可以原地排序.尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的. 冒泡排序是与插入排序拥有相等的执行时间,但是两种法在需要的交换次

《数据结构与算法分析:C语言描述》复习——第六章“排序”——冒泡排序

2014.06.17 01:04 简介: 冒泡排序是O(n^2)级别的交换排序算法,原理简单,属于必知必会的基础算法之一. 思路: 排序要进行N轮,每一轮从尾部逐个向前扫描,遇到逆序对就进行交换.确保每一轮把最小的元素交换到前面去.这个过程好比水中的气泡向上飘,所以叫冒泡排序.代码非常简单,所以语言描述反而显得麻烦了. 实现: 1 // My implementation for bubble sort. 2 #include <iostream> 3 #include <vector&

数据结构排序算法Java实现

闲的无聊又拿起了大学的数据结构的书看起来 <数据结构(c语言版)>严蔚敏 吴伟民编著. 里面有几个排序算法,感觉挺好玩的,就想着写出来玩玩. package test.sort; /** * @Title: TODO * @Description: TODO * @author: * @date: 2014-8-10 上午11:20:43 * */ public class quickSort { private static int datas[] = {23,42,12,45,56,63,

算法大神之路----排序(冒泡排序法)

冒泡排序法 冒泡排序法又称为交换排序法,是由观察水中冒泡变化构思而成,气泡随着水深压力而改变.气泡在水底时,水压最大,气泡最小,而气泡慢慢浮上水面时,气泡所受压力最小,体积慢慢变大. 冒泡排序比较方式是从第一个元素开始,比较相邻的元素大小,如果大小顺序有误,则对调后进行下一个元素比较.直到所有元素满足关系为止. 冒泡排序法分析 冒泡排序法平均情况下,需要比较(n-1)/2次,时间复杂度为O(n2),最好的情况只需要扫描一次,不用操作,即作n-1次比较,时间复杂度为O(n). 由于冒泡排序为相邻两

数据结构--排序

插入排序(上)     基本思想:每次将一个待排序的的元素,按其关键字大小插入到已经排好序的子表的适当位置,直到全部元素插完为止.直接插入排序    简写排序思路:     假设待排序的元素存放在R[0.....n-1]中,在排序过程中,将R划分为两个区间,分别为R[0.....i-1]和R[i....n-1](刚开始时i=1,有序区只有R[0]一个元素),    其中,前一个子区间即是一个已经排好序的子区间,即有序区,后一个子区间则是一个待排序的无序区.   直接插入排序的操作即是:将当前无序

数据结构--排序(下)--基数排序

基数排序 前面的算法有一个公关特点,就是基于比较大小来排序的.最坏情况NlogN,除了比较外,在做个些别的事情. 桶排序 假设我们有N个学生,他们的成绩是0到100之间的整数(于是有M=101个不同的成绩值).如何在线性时间内将学生按成绩排序? 建立101个桶 void Bucket_Sort(ElementType A[], int N) { count[]初始化; while (读入1个学生成绩grade) 将该生插入count[grade]链表; for ( i=0; i<M; i++ )

黑马程序员——数据结构排序算法总结

-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 下面是几个网上常见的总结图: 有些不同之处:集中在希尔排序的时间复杂度.快速归并的空间复杂度上 个人总结口诀: 选择N方-->选择排序的最好最坏平均都N方 插入冒泡最好N-->插入冒泡的最好是N,其他是N方 归并堆n乘logN-->归并希尔堆的最好最坏平均都是n乘logN 快速最坏N方-->快速排序的最坏是N方,其他是n乘logN 快速选择希尔堆不稳定-->

排序——冒泡排序(三种方法)

冒泡排序的基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 关于程序中4中冒泡排序写法的说明: bubble_sort1:基本的冒泡排序的写法. bubble_sort2:基本冒泡排序的不同写法,基本的冒泡排序是每次遍历,每次缩小范围1,这种办法是每次正向和反向遍历,每次缩小范围2,所以两者的比较次数也是一样的. bubble_sort

数据结构 排序(选择排序)

//排序--选择排序法 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> /* 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素, 存放在序列的起始位置,直到全部待排序的数据元素排完. 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导