1.技术始于需求
现在有一组数组,需要按照从小到大排序:
int[] value = { 18, 16, 12, 2 };
每次用if进行判断,提取数组的第一个元素跟第二个元素进行对比,如果第一个比第二个大,就替换。表达式为:
int temp; //创建一个临时变量
if(value[0]>value[1])
{
temp=value[0];
value[0]=value[1];
value[1]=temp;
}
经过这步之后,数组的顺序变为{16,18,12,2} ,接下来第二个元素跟第三个元素对比。表达式为:
if(value[1]>value[2])
{
temp=value[1];
value[1]=value[2];
value[2]=temp;
}
经过这步之后,数组的顺序变为{16,12,18,2}。此时发现,每次对比只有数组的索引发生变化,所以可以用for循环代替。
for(int i=0; i<value.Length - 1; i++)
{
if(value[ i ]>value[ i+1 ])
{
temp=value[ i ];
value[ i ]=value[ i+1 ];
value[ i+1 ]=temp;
}
}
经过for循环之后,数组的顺序变为{16,12,2,18}。第一次筛选只是把整个数组中最大的值排在了最后一个,所以还需要排序
{16,12,2} ,表达式为
for(int i=0; i<value.Length - 2; i++) //只需在排序时忽略最后一个元素即可
{
if(value[ i ]>value[ i+1 ])
{
temp=value[ i ];
value[ i ]=value[ i+1 ];
value[ i+1 ]=temp;
}
}
经过这次循环之后,数组的顺序变为{12,2,16}。for循环就是为了消除单纯变化的部分。第一次循环条件为 i<value.Length - 1,第二次为i<value.Length - 2,所以可以创建另一个嵌套:
for( j= items.Length - 1; j >= 0; j--) //用 j取代 i<value.Length - 1中的变化部分-->for (i = 0; i < j; i++)
完整部分:
for(j= items.Length - 1; j>=0;j--)
{
for (i = 0; i < j; i++)
{
if (items[i] > items[i + 1])
{
temp = items[i];
items[i] = items[i + 1];
items[i + 1] = temp;
}
}
}
完整代码为:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WeiTuo
{
class Program
{
static void Main(string[] args)
{
int[] value = { 18, 16, 12, 2 };
SimpleSort.BubbleSort(ref value);
for(int i = 0; i < value.Length ; i++)
{
Console.WriteLine(value[i].ToString());
}
Console.Read();
}
}
static class SimpleSort
{
public static void BubbleSort(ref int[] items)
{
int i;
int j;
int temp;
if (items == null)
return;
//for (i = 0; i < items.Length - 1; i++)
//{
// if (items[i] > items[i + 1])
// {
// temp = items[i];
// items[i] = items[i + 1];
// items[i + 1] = temp;
// }
//}
for (j = items.Length - 1; j >= 0; j--)
{
for (i = 0; i < j; i++)
{
if (items[i] > items[i + 1])
{
temp = items[i];
items[i] = items[i + 1];
items[i + 1] = temp;
}
}
}
}
}
}