设为首页 加入收藏

TOP

分治、递归,冒泡、奇偶、快速、希尔排序(三)
2015-11-21 01:23:30 来源: 作者: 【 】 浏览:17
Tags:分治 递归 冒泡 奇偶 快速 希尔 排序
个大于第二个),则交换。下一步重复该操作,但针对所有的(偶-奇)位置数字对。如此交替进行下去。

Python语言
# 假设已有列表a等待排序
while True:
sorted = True
# 处理奇-偶对
for i in xrange(1, len(a)-1, 2):
if a[i] > a[i+1]: a[i], a[i+1] = a[i+1], a[i] # 交换
sorted = False
# 处理偶-奇对
for i in xrange(0, len(a)-1, 2):
if a[i] > a[i+1]:
a[i], a[i+1] = a[i+1], a[i] # 交换
sorted = False
if sorted:
break

java script语言
/* 假设已有数组a等待排序 */
var sorted = false;
while(!sorted)
{
sorted=true;
for(var i = 1; i < list.length-1; i += 2)
{
if(a[i] > a[i+1])
{
swap(a, i, i+1);
sorted = false;
}
}

for(var i = 0; i < list.length-1; i += 2)
{
if(a[i] > a[i+1])
{
swap(a, i, i+1);
sorted = false;
}
}

五、快速排序
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

步骤为:

从数列中挑出一个元素,称为 "基准"(pivot),重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为 分割(partition)操作。递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递回的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递回下去,但是这个演算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

C#实现
static void Main(string[] args)
{
int[] a = new int[] { 10, 22, 30, 3, 31, 5, 36, 68, 103, 90, 100, 93 };
for (int i = 0; i < 7; i++)
{
Console.Write(a[i]+" ");
}
Console.WriteLine();
Sort(a, 0, 6);
for (int i = 0; i < 7; i++)
{
Console.Write(a[i] + " ");
}
}
public static void Sort(int[] numbers)
{
Sort(numbers, 0, numbers.Length - 1);
}
private static void Sort(int[] numbers, int left, int right)
{
if (left < right)
{
int middle = numbers[(left + right) / 2];
int i = left - 1;
int j = right + 1;
while (true)
{
while (numbers[++i] < middle) ;
while (numbers[--j] > middle) ;
if (i >= j)
break;
Swap(numbers, i, j);
}
Sort(numbers, left, i - 1);
Sort(numbers, j + 1, right);
}
}
private static void Swap(int[] numbers, int i, int j)
{
int number = numbers[i];
numbers[i] = numbers[j];
numbers[j] = number;
}


六、直接插入法
C#实现
static void Main(string[] args)
{
int temp;
int[] a = new int[10] { 12, 23, 32, 15, 73, 30, 09, 20, 90, 85 };
for(int i=0;i {
temp = a[i];
int j = i;
while((j>0)&&(a[j-1]>temp))
{
a[j] = a[j - 1];
j -= 1;
}
a[j] = temp;
}
foreach(int i in a)
{
Console.Write(i+" ");
}
}

七、希尔排序法
希尔排序又称“缩小增量排序”,其基本思想是,先将整个待排序的一组序列分割成为若干子序列,然后分别进行直接插入排序,待整个序列中的数“基本有序”时再对全体记录进行一次直接插入排序。
C#实现
static void Main(string[] args)
{
int[] a = new int[10] { 12, 23, 32, 15, 73, 30, 09, 20, 90, 85 };
if(a!=null)
{
int inc;
for (inc = 1; inc <= a.Length / 9; inc = 3 * inc + 1) ; // 截断序列
for(;inc>0;inc/=3)
{
for(int i=inc+1;i<=a.Length;i+=inc)
{
int temp = a[i - 1]; // 记录当前值
int j = i; // 定义下一个索引
while((j>inc)&&(a[j-inc-1]>temp))
{
a[j - 1] = a[j - inc - 1];
j -= inc;
}
a[j - 1] = temp; // 将下一个元素值设置为当前值
}
}
foreach(int i in a)
{
Console.Write(i + " ");
}
}
}

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 1696 Space Ant 计算几何 叉.. 下一篇poj2488 ..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: