谁能给我讲讲冒泡排序的原理
解决方案 »
- 如何不重启机器电脑.加载自定义字体.
- 为多个dropdownlist赋值
- 求高手 一替换“正则表达式”(vs2008)
- 请问msdn中的System.Threading.Thread.Join方法的说明是:阻塞调用线程,直到某个线程终止时为止"中的调用线程是指哪个线程?
- 请教一个将DataTable表更新到Sql的问题
- 急求关于C#绘图方面的资料及源码
- c#程序最多可使用多大的内存?
- 如何自由调用onPaint()函数,实现对图形的控制
- 问一下C#中类似于left,right,mid的函数怎么用呀,我怎么用不了呀
- 超简单问题?
- 怎样引用dll中带有@的函数
- 用C#写了个俄罗斯方块,图像放在panel 中,在panel中绘制图,结果图像闪烁,急求解决
还不如找本书自己看看呢
B:“沒有。”
A:“那我得浮在你上面。”
C:“A,瞧你小樣,你還沒我大,在我下面待著吧。”
{
for(int j=(arr.Length-1);j>=i;j--)
{
if(arr[j+1]<arr[j])
{
int temp= arr[j];
arr[j+1]=arr[j];
arr[j] = temp;
}
}
}
/// <summary>
/// 基本思路:两两比较
/// 排序,按升序排列
/// </summary>
/// <param name="str"></param>
public static void GetSort(int[] str)
{
int temp = 0;
Console.Write("原数组是:");
for (int i = 0; i < str.Length; i++)
{
Console.Write(str[i]+"\t");
}
Console.WriteLine();
for (int i = 0; i <str.Length; i++)
{
Console.WriteLine("第{0}轮的排序结果是:",i+1);
for (int j = 0; j < str.Length-1-i; j++) //两两比较 没一轮比较都会依次递减比表的次数
{
if (str[j] > str[j + 1])//比较相邻的两个数
{
temp = str[j]; //把较大的值放入到临时变量里
str[j] = str[j + 1]; //因为是升序 数组第一位放较小值
str[j + 1] = temp; //因为是升序 数组第二位放较大值(即temp)
}
//打印每次比较的结果
for (int k = 0; k < str.Length; k++)
{
Console.Write(str[k] + "\t");
}
Console.WriteLine();
} Console.WriteLine();
}
}
/// <summary>
/// 降序,按降序排列
/// </summary>
/// <param name="str"></param>
public static void GetSort1(int[] str)
{
int temp = 0;
for (int i = 0; i < str.Length; i++) //外循环5次
{
for (int j = 0; j < str.Length - 1 - i; j++)
{
if (str[j] < str[j + 1]) //如果前一个小于后一个
{
temp = str[j]; //第一个值和它的下一个值比较 把小的就放入到临时变量里
str[j] = str[j + 1]; //把大的这个值放入到它后面
str[j + 1] = temp; //把小的这个值放入到第一位
}
//打印每次比较的结果
for (int k = 0; k < str.Length; k++)
{
Console.Write(str[k] + "\t");
}
Console.WriteLine(); } Console.WriteLine(); }
}
楼主看看这个吧
/// <summary>
/// 基本思路:两两比较
/// 排序,按升序排列
/// </summary>
/// <param name="str"></param>
public static void GetSort(int[] str)
{
int temp = 0;
Console.Write("原数组是:");
for (int i = 0; i < str.Length; i++)
{
Console.Write(str[i]+"\t");
}
Console.WriteLine();
for (int i = 0; i <str.Length; i++)
{
Console.WriteLine("第{0}轮的排序结果是:",i+1);
for (int j = 0; j < str.Length-1-i; j++) //两两比较 没一轮比较都会依次递减比表的次数
{
if (str[j] > str[j + 1])//比较相邻的两个数
{
temp = str[j]; //把较大的值放入到临时变量里
str[j] = str[j + 1]; //因为是升序 数组第一位放较小值
str[j + 1] = temp; //因为是升序 数组第二位放较大值(即temp)
}
//打印每次比较的结果
for (int k = 0; k < str.Length; k++)
{
Console.Write(str[k] + "\t");
}
Console.WriteLine();
} Console.WriteLine();
}
}
/// <summary>
/// 降序,按降序排列
/// </summary>
/// <param name="str"></param>
public static void GetSort1(int[] str)
{
int temp = 0;
for (int i = 0; i < str.Length; i++) //外循环5次
{
for (int j = 0; j < str.Length - 1 - i; j++)
{
if (str[j] < str[j + 1]) //如果前一个小于后一个
{
temp = str[j]; //第一个值和它的下一个值比较 把小的就放入到临时变量里
str[j] = str[j + 1]; //把大的这个值放入到它后面
str[j + 1] = temp; //把小的这个值放入到第一位
}
//打印每次比较的结果
for (int k = 0; k < str.Length; k++)
{
Console.Write(str[k] + "\t");
}
Console.WriteLine(); } Console.WriteLine(); }
}
原理就是 外层循环 先找出n个数中最小的,放在最左面 。
然后在剩下的n-1数中,再找出最小的,放在左面第2个。
然后在剩下的n-2数中,再找出最小的,放在左面第3个。
直到最后还剩1个数,他就是最大的,在最右面。完毕
第2 次: 把最大(最小)的数字放在第1位!(除前第1位)
第3 次: 把最大(最小)的数字放在第1位!(除前第2位)
...
第n-1次: 把最大(最小)的数字放在第1位!(除前第n-2位)以下! 谢谢
j < str.Length - 1 - i;啊
这样一趟过去后,最大或最小的数字被交换到了最后一位,
然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子
例子为从小到大排序,
原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |第一趟排序(外循环)
第一次两两比较6 > 2交换(内循环)
交换前状态| 6 | 2 | 4 | 1 | 5 | 9 |
交换后状态| 2 | 6 | 4 | 1 | 5 | 9 |
第二次两两比较,6 > 4交换
交换前状态| 2 | 6 | 4 | 1 | 5 | 9 |
交换后状态| 2 | 4 | 6 | 1 | 5 | 9 |第三次两两比较,6 > 1交换
交换前状态| 2 | 4 | 6 | 1 | 5 | 9 |
交换后状态| 2 | 4 | 1 | 6 | 5 | 9 |第四次两两比较,6 > 5交换
交换前状态| 2 | 4 | 1 | 6 | 5 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |第五次两两比较,6 < 9不交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第二趟排序(外循环)
第一次两两比较2 < 4不交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第二次两两比较,4 > 1交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
第三次两两比较,4 < 5不交换
交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
第四次两两比较,5 < 6不交换
交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |第三趟排序(外循环)
第一次两两比较2 > 1交换
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
第二次两两比较,2 < 4不交换
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
第三次两两比较,4 < 5不交换
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |第四趟排序(外循环)无交换
第五趟排序(外循环)无交换排序完毕,输出最终结果1 2 4 5 6 9动态演示
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次,内循环依次重复9,8,...,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,9,对于每一个i,j的值依次为1,2,...10-i。
// bubbleSort.java
// demonstrates bubble sort
// to run this program: C>java BubbleSortApp
////////////////////////////////////////////////////////////////
class ArrayBub
{
private long[] a; // ref to array a
private int nElems; // number of data items
//--------------------------------------------------------------
public ArrayBub(int max) // constructor
{
a = new long[max]; // create the array
nElems = 0; // no items yet
}
//--------------------------------------------------------------
public void insert(long value) // put element into array
{
a[nElems] = value; // insert it
nElems++; // increment size
}
//--------------------------------------------------------------
public void display() // displays array contents
{
for(int j=0; j<nElems; j++) // for each element,
System.out.print(a[j] + " "); // display it
System.out.println("");
}
//--------------------------------------------------------------
public void bubbleSort()
{
int out, in; for(out=nElems-1; out>1; out--) // outer loop (backward)
for(in=0; in<out; in++) // inner loop (forward)
if( a[in] > a[in+1] ) // out of order?
swap(in, in+1); // swap them
} // end bubbleSort()
//--------------------------------------------------------------
private void swap(int one, int two)
{
long temp = a[one];
a[one] = a[two];
a[two] = temp;
}
//--------------------------------------------------------------
} // end class ArrayBub
////////////////////////////////////////////////////////////////
public class BubbleSortApp
{
public static void main(String[] args)
{
int maxSize = 100; // array size
ArrayBub arr; // reference to array
arr = new ArrayBub(maxSize); // create the array arr.insert(77); // insert 10 items
arr.insert(99);
arr.insert(44);
arr.insert(55);
arr.insert(22);
arr.insert(88);
arr.insert(11);
arr.insert(00);
arr.insert(66);
arr.insert(33); arr.display(); // display items arr.bubbleSort(); // bubble sort them arr.display(); // display them again
} // end main()
} // end class BubbleSortApp
////////////////////////////////////////////////////////////////
int[] arr = { 1, 4, 2, 5, 3,6,89,77 }; for(int i=1;i< arr.length;i++)
{
for(int j=arr.length-1-i;j>=0;j--)
{
if(arr[j+1]<arr[j])
{
int temp= arr[j+1];
arr[j+1]=arr[j];
arr[j] = temp;
}
}
}
for (int k = 0; k < arr.length; k++) {
System.out.println("排序后的结果--------->"+arr[k]);
}