冒泡排序(改进)和选择排序

来源:互联网 发布:管家婆软件下载地址 编辑:程序博客网 时间:2024/05/24 22:45

最近老师在讲排序,自己整理了一下冒泡排序和选择排序,供大家参考,有问题记得联系我哦


(一)、【冒泡排序】

参考:
http://baike.baidu.com/link?url=WzNyqnxFZbPRbqqLLMdwbtqbB69Lb6542PR2wELGWKzI8hxsoWW6fuJPquZhD8hf#1
http://zh.wikipedia.org/wiki/冒泡排序
http://baike.so.com/doc/2392104.html
【冒泡排序算法的运作】如下:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
例:核心代码
int[] arr={23, 34, 54, 5653, 43, 88};//arr存放待排序的数
for(int i=0; i<arr.Length; i++)
{
for(int j=0; j<arr.Length-1; j++)
{
if(arr[j]>arr[j+1])
{
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
【冒泡排序改进】
改进一:使用标志的冒泡排序
(加一个标志位,当某一趟冒泡排序没有元素交换时,则冒泡结束,元素
已经有序,可以有效的减少冒泡次数。)
int[] arr = { 23, 34, 54, 5653, 43, 88 };//arr存放待排序的数
bool flag = true;//标记
while (flag)
{
    flag = false;
    for (int i = 0; i < arr.Length-1; i++)
    {
        if (arr[i] > arr[i + 1])
        {
            int temp = arr[i];
            arr[i] = arr[i + 1];
            arr[i + 1] = temp;
            flag = true;
        }
    }
}
改进二:记录每一次元素交换的位置,当元素交换的位置在第0个元素时,则排序结束。
理解:如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前
面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位
置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到
这个位置就可以了。
int[] arr = { 23, 34, 54, 5653, 43, 88 };//arr存放待排序的数
int i = arr.Length - 1;
int lastChange = 0;
int j;
while(i > 0)
{
lastChange = 0;
for (j = 0; j < i; j++)
{
if (arr[j] > arr[j+1])
{
int temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
lastChange = j;
}
}
  i = lastChange;

(二)、选择排序
理解:先找出所有最小的数放在第一位,然后再在剩下的数中找出最小的数放在第二位……以此类推
知道所有的数都排完,结束排序
int[] arr = { 23, 34, 54, 5653, 43, 88 };//arr存放待排序的数
for(int i=0; i<=arr.Length; i++)
{
for(int j=i+1; j<=arr.Length; j++)
{
if(arr[i]>arr[j])
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}







0 0
原创粉丝点击