冒泡排序

首先排序分为四种: 

      交换排序: 包括冒泡排序,快速排序。

      选择排序: 包括直接选择排序,堆排序。

      插入排序: 包括直接插入排序,希尔排序。

      合并排序: 合并排序。

冒泡排序:

首先我们自己来设计一下“冒泡排序”,这种排序很现实的例子就是:

我抓一把沙仍进水里,那么沙子会立马沉入水底, 沙子上的灰尘会因为惯性暂时沉入水底,但是又会立马像气泡一样浮出水面,最后也就真相大白咯。

 关于冒泡的思想,我不会说那么官方的理论,也不会贴那些文字上来,我的思想就是看图说话。

那么我们就上图.

           

要达到冒泡的效果,我们就要把一组数字竖起来看,大家想想,如何冒泡?如何来体会重的沉底,轻的上浮?

 第一步:  我们拿40跟20比,发现40是老大,不用交换。

第二步:  然后向前推一步,就是拿20跟30比,发现30是老大,就要交换了。

第三步:拿交换后的20跟10比,发现自己是老大,不用交换。

第四步:拿10跟50交换,发现50是老大,进行交换。

 最后,我们经过一次遍历,把数组中最小的数字送上去了,看看,我们向目标又迈进了一步。

 实现 C++程序:

 1 #include<iostream>
 2 #include <ctime>  //使用了time() 函数 
 3 #include <cstdlib>    //使用了srand()函数 
 4 
 5 const int N=20005;
 6 int a[N];
 7 using namespace std;
 8 //冒泡排序算法
 9         void bubblesort(int *a, int n)
10         {
11             int temp;
12             //第一层循环: 表明要比较的次数,比如n个数,肯定要比较n-1次
13             for (int i = 1; i < n; i++)
14             {
15                 //j>i: 从后往前的的下标一定大于从前往后的下标,否则就超越了。
16                 for (int j = n; j > i; j--)
17                 {
18                     //如果前面一个数大于后面一个数则交换
19                     if (a[j - 1] > a[j])
20                     {
21                         temp = a[j - 1];
22                         a[j - 1] = a[j];
23                         a[j] = temp;
24                     }
25                 }
26             }
27         }
28                  
29 
30 int main()
31 {
32     //随机产生n个数存入数组a中 
33     int n=17000;
34     srand(int(time(0)));      //利用时间函数time(),产生每次不同的随机数种子
35     for(int i=1;i<=n;i++) a[i]=rand();  //随机产生3000个数存于数组a中 (从1开始) 
36     clock_t start = clock();
37     bubblesort(a,n);                   //对数组a进行排序(从1开始) 
38     clock_t end = clock();
39     for(int i=1;i<=20;i++) cout<<a[i]<<' ';    //输出前20个数据(已从小到大排序) 
40     cout<<endl<<"冒泡排序耗时为:"<<end-start<<"ms"<<endl; 
41     return 0;
42 }

         经我亲测在1秒中之内,可排序的数据为17000个,原因为冒泡的时间复杂度为O(n2),因此只能排17000个数据,要想排序次数超过万级,就必须更换成新的排序方法。

原文地址:https://www.cnblogs.com/jjzzx/p/5065052.html