Ⅰ 冒泡排序
冒泡排序的英文Bubble Sort,是一种最基础衫神的交换排序。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。
冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时孙塌拆进行交换。一直重复这个过程,直到没有任何两个相邻元素可以交换,就表明完成了排序。
一般情况下,称某个排序算法稳定,指的是当待排序序列中有相同的元素时,它们的相对位置在排序前后不会发生改变。
请点击输入图片描述(最多18字)
泡排序的原理:
每一趟只能确定将一个数归位则枣。即第一趟只能确定将末位上的数归位,第二趟只能将倒数第2位上的数归位,依次类推下去。如果有n个数进行排序,只需将n-1个数归位,也就是要进行n-1趟操作。
而“每一趟”都需要从第一位开始进行相邻的两个数的比较,将较大的数放后面,比较完毕之后向后挪一位继续比较下面两个相邻的两个数大小关系,重复此步骤,直到最后一个还没归位的数。
Ⅱ 算法- 冒泡排序(Bubble Sort)
冒泡排序是一种计算机科学领域的较简单的排序算法。
从后向前,比较相邻的元素,如果第一个比第二个大,就交换他们两个。比较每一对相邻元素,到队尾最后一个元素应该会是最大的数。依次类推,比出第二大的数,直至所有元素都成倒叙排列(9,8,7,6,5,4,3,2,1,0)
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
时间复杂度
若文件本身的排列和想要的排列一致,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值。
原排序(9,8,7,6,5,4,3,2,1,0) ➡ 需要排序(9,8,7,6,5,4,3,2,1,0)
[图片上丛清键传失败...(image-b8e712-1571212381789)]
若文件本身的排列和想要的排列相反,需要进行n-1趟排序,每趟排序要进行n-i次关键字的比较。
比如 原排序(1,2,3,4,5) ➡ 需要排序(5,4,3,2,1)
n = 5, 1 <= i <5 ; 排列次数 1+2+3+...+(n-1) = n*(n-1)/2 ;
每次比较都必须移动正返记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
[图片上传失败...(image-36e71a-1571212381789)]
[图片上传失败...(image-fc1c25-1571212381789)]
冒泡排序的最坏渗巧时间复杂度为 [图片上传失败...(image-10a015-1571212381789)]
。
冒泡排序总的平均时间复杂度为 [图片上传失败...(image-1272a9-1571212381789)]
。
算法描述
C语言
void bubble_sort(int a[] , int n)
{
}
OC语言
NSMutableArray * arr = [NSMutableArray arrayWithObjects:@"5",@"4",@"3",@"2",@"1", nil];
for (int j = 0; j < arr.count - 1; j++) {
}
NSLog(@"%@",arr);
时间复杂度
算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用于大O符号表示,不包括这个函数的低阶项和首项系数。O(n)即时间复杂度为n。
Ⅲ 冒泡排序算法
从小到大的排序
class Program
{
public static void Sort(int[] myArray)
{
// 取长度最长的词组 -- 冒泡法
for (int j = 1; j < myArray.Length;j++)
{
for (int i = 0; i < myArray.Length - 1; i++)
{
// 如果 myArray[i] > myArray[i+1] ,则 myArray[i] 上浮一位
if (myArray[i] >myArray[i + 1])
{
int temp = myArray[i];
myArray[i] = myArray[i + 1];
myArray[i + 1] = temp;
}
}
}
}
static void Main(string[] args)
{
int[] myArray = new int[] { 10, 8, 3, 5, 6, 7, 4, 6, 9 };
Sort(myArray);
for (int m = 0; m < myArray.Length; m++)
{
Console.WriteLine(myArray[m]);
}
}
从大到小的排序
class Program
{
public static void Sort(int[] myArray)
{
// 取长度最长的词组 -- 冒泡法
for (int j = 1; j < myArray.Length;j++)
{
for (int i = 0; i < myArray.Length - 1; i++)
{
// 如果 myArray[i] < myArray[i+1] ,则 myArray[i] 下沉一位
if (myArray[i] < myArray[i + 1])
{
int temp = myArray[i];
myArray[i] = myArray[i + 1];
myArray[i + 1] = temp;
}
}
}
}
static void Main(string[] args)
{
int[] myArray = new int[] { 10, 8, 3, 5, 6, 7, 4, 6, 9 };
Sort(myArray);
for (int m = 0; m < myArray.Length; m++)
{
Console.WriteLine(myArray[m]);
}
}
Ⅳ 冒泡排序的算法原理
冒泡排序算法的运作如下:(从后往前) 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
Ⅳ 请编程实现一个冒泡排序算法
算法思想简单描述:
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上
而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较
小的往上冒。即:每当两相邻的数比较后发现它们的侍隐排序与排序要
求相反时,就将它们互换。
下面是一种改进的冒泡算法,它记录了每一遍扫描后最后下沉数的
位置k,这样可以减少外察带层循环扫描的次数。
冒泡排序是稳定的。算法时间复杂度O(n^2)
算法实现:
/*
功能:冒泡排序
输入:数组名称(也就老没厅是数组首地址)、数组中元素个数
*/
void bubble_sort(int *x, int n)
{
int j, k, h, t;
for (h=n-1; h>0; h=k) /*循环到没有比较范围*/
{
for (j=0, k=0; j<h; j++) /*每次预置k=0,循环扫描后更新k*/
{
if (*(x+j) > *(x+j+1)) /*大的放在后面,小的放到前面*/
{
t = *(x+j);
*(x+j) = *(x+j+1);
*(x+j+1) = t; /*完成交换*/
k = j; /*保存最后下沉的位置。这样k后面的都是排序排好了的。*/
}
}
}
}
Ⅵ 用flash做冒泡排序算法
我收藏了一个,你给我一个邮箱吧
Ⅶ c语言冒泡排序法流程图
.example-btn{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.example-btn:hover{color:#fff;background-color:#47a447;border-color:#398439}.example-btn:active{background-image:none}div.example{width:98%;color:#000;background-color:#f6f4f0;background-color:#d0e69c;background-color:#dcecb5;background-color:#e5eecc;margin:0 0 5px 0;padding:5px;border:1px solid #d4d4d4;background-image:-webkit-linear-gradient(#fff,#e5eecc 100px);background-image:linear-gradient(#fff,#e5eecc 100px)}div.example_code{line-height:1.4em;width:98%;background-color:#fff;padding:5px;border:1px solid #d4d4d4;font-size:110%;font-family:Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;word-break:break-all;word-wrap:break-word}div.example_result{background-color:#fff;padding:4px;border:1px solid #d4d4d4;width:98%}div.code{width:98%;border:1px solid #d4d4d4;background-color:#f6f4f0;color:#444;padding:5px;margin:0}div.code div{font-size:110%}div.code div,div.code p,div.example_code p{font-family:"courier new"}pre{margin:15px auto;font:12px/20px Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;border:1px solid #ddd;border-left-width:4px;padding:10px 15px} 排序算法是《数据历唯乎结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。以下是冒泡排序算法:
冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。
作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。冒泡排序还有一种优化算法,就是立肢悉一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来
说并没有山携什么太大作用。 1. 算法步骤
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
2. 动图演示
3. 什么时候最快
当输入的数据已经是正序时(都已经是正序了,我还要你冒泡排序有何用啊)。
4. 什么时候最慢
当输入的数据是反序时(写一个 for 循环反序输出数据不就行了,干嘛要用你冒泡排序呢,我是闲的吗)。 5. JavaScript 代码实现 实例 function bubbleSort ( arr ) {
var len = arr. length ;
for ( var i = 0 ; i arr [ j+ 1 ] :
arr [ j ] , arr [ j + 1 ] = arr [ j + 1 ] , arr [ j ]
return arr
7. Go 代码实现 实例 func bubbleSort ( arr [] int ) [] int {
length := len ( arr )
for i := 0 ; i < length ; i ++ {
for j := 0 ; j < length - 1 - i ; j ++ {
if arr [ j ] > arr [ j + 1 ] {
arr [ j ], arr [ j + 1 ] = arr [ j + 1 ], arr [ j ]
}
}
}
return arr
}
8. Java 代码实现 实例 public class BubbleSort implements IArraySort {
@Override
public int [ ] sort ( int [ ] sourceArray ) throws Exception {
// 对 arr 进行拷贝,不改变参数内容
int [ ] arr = Arrays . Of ( sourceArray, sourceArray. length ) ;
for ( int i = 1 ; i
Ⅷ C#中冒泡排序的算法思想
交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。
冒泡排序
1、排序方法
将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
(1)初始
R[1..n]为无序区。
(2)第一趟扫描
从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。即依次比较(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);对于每对气泡(R[j+1],R[j]),若R[j+1].key<R[j].key,则交换R[j+1]和R[j]的内容。
第一趟扫描完毕时,"最轻"的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置R[1]上。
(3)第二趟扫描
扫描R[2..n]。扫描完毕时,"次轻"的气泡飘浮到R[2]的位置上……
最后,经过n-1 趟扫描可得到有序区R[1..n]
注意:
第i趟扫描时,R[1..i-1]和R[i..n]分别为当前的有序区和无序区。扫描仍是从无序区底部向上直至该区顶部。扫描完毕时,该区中最轻气泡飘浮到棚州顶部位置R[i]上,结果是R[1..i]变为新的有序区。
2、冒泡排序过程示例
对关键字序列为49 38 65 97 76 13 27 49的文件进行冒泡排序的过程【参见动画演示】
3、排序算法
(1)分析
因为每一趟排序都使有序区增加了一个气泡,在经过n-1趟排序之后,有序区中就有n-1个气泡,而无序区中气泡的重量总是大于等于有序区中气泡的重量,所以整个冒泡排序过程至多需要进行n-1趟排序。
若在某一趟排序中未发现气泡位置的交换,则说明待排序的无序区中所有气泡均满足轻者在上,重者在下的原则,因此,冒泡排序过程可在此趟排序后终止。神陆为此,在下面给出的算法中,引入一个布尔量exchange,在每趟排序开始前,先将其置为FALSE。若排序过程中发生了交换,则将其置为TRUE。各趟排序结束时检查exchange,若未曾发生过交换则终止算法,不再进行下一链瞎蔽趟排序。
(2)具体算法
void BubbleSort(SeqList R)
{ //R(l..n)是待排序的文件,采用自下向上扫描,对R做冒泡排序
int i,j;
Boolean exchange; //交换标志
for(i=1;i<n;i++){ //最多做n-1趟排序
exchange=FALSE; //本趟排序开始前,交换标志应为假
for(j=n-1;j>=i;j--) //对当前无序区R[i..n]自下向上扫描
if(R[j+1].key<R[j].key){//交换记录
R[0]=R[j+1]; //R[0]不是哨兵,仅做暂存单元
R[j+1]=R[j];
R[j]=R[0];
exchange=TRUE; //发生了交换,故将交换标志置为真
}
if(!exchange) //本趟排序未发生交换,提前终止算法
return;
} //endfor(外循环)
} //BubbleSort