蛋疼作,多线程快速排序

基础是快速排序法,但是单独写快速排序法太没创意,于是我用多线程来加快排序速度.
昨天和同学讨论快速排序时突然脑抽想到这个,没有专门去学习并行算法,所以是否合理就不晓得了..= =|||
对于CPU核心很多的机器来说,应该能起到加速的作用,但用在个人电脑上纯属没事找事,浪费资源..= =|||

using  System;
using  System.Threading;

namespace  Takamachi660.Math
ExpandedBlockStart.gifContractedBlock.gif
{
    
public static class MultiThreadQuickSort_V4<T> where T : IComparable<T> //泛型约束:泛型参数必须实现IComparable接口
ExpandedSubBlockStart.gifContractedSubBlock.gif
    {
        
private class Package   //封装参数,因为Thread.Start()方法仅允许一个object类型的参数
ExpandedSubBlockStart.gifContractedSubBlock.gif
        {
            
public T[] a;       //数组对象
            public int left;    //左指针(索引)
            public int right;   //右指针(索引)
            public Package(T[] a, int left, int right)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
this.a = a;
                
this.left = left;
                
this.right = right;
            }

        }

        
private delegate void SortDelegate(object pkg);
        
private delegate int PartDelegate(T[] a, int index, T m, int boun, bool IsLeft);    //声明两个委托类型
        static public IAsyncResult BeginInvokeQuickSort(T[] Objs, AsyncCallback SortFinished, object CallBackParameter)    //对外接口,异步调用,返回一个指示异步执行状态的IAsyncResult对象
ExpandedSubBlockStart.gifContractedSubBlock.gif
        {//三个参数分别为:要排序的数组,排序完成后的回调函数委托,回调函数的参数
            return new SortDelegate(Sorting).BeginInvoke(new Package(Objs, 0, Objs.Length - 1), SortFinished, CallBackParameter);
        }

        
static private void Sorting(object pkg) //快速排序递归函数
ExpandedSubBlockStart.gifContractedSubBlock.gif
        {   //拆箱子
            T[] a = ((Package)pkg).a;
            
int left = ((Package)pkg).left;
            
int right = ((Package)pkg).right;

            
if (left >= right)  //递归结束条件
                return;
            
int l, r;
            T m;    
//中间元素的值
            l = left - 1;
            r 
= right + 1;
            m 
= a[left];//以第一个元素作为中间元素
            while (l < r)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{   //通过异步调用使左右指针同时移动
                PartDelegate par = new PartDelegate(Position);
                IAsyncResult arl 
= par.BeginInvoke(a, l, m, right, truenullnull);
                r 
= Position(a, r, m, left, false);
                l 
= par.EndInvoke(arl);
                
                
if ((l + 1< (r - 1))
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    T iTemp 
= a[l + 1];
                    a[l 
+ 1= a[r - 1];
                    a[r 
- 1= iTemp;
                }

                
else
                    
break;
            }

            
if (l > r)
                l 
= r;
            a[left] 
= a[l];
            a[l] 
= m;

            Thread leftpart 
= new Thread(new ParameterizedThreadStart(Sorting));
            leftpart.IsBackground 
= true;   //后台线程
            leftpart.Priority = ThreadPriority.BelowNormal; //优先级低于正常

            leftpart.Start(
new Package(a, left, l - 1));    //递归调用,左边部分和右边部分同时开始排序,启动一条新线程排序左边部分
            Sorting(new Package(a, l + 1, right));          //当前线程排序右边部分

            leftpart.Join();    
//等待左边部分完成
        }

        
static private int Position(T[] a, int index, T m, int boun, bool IsLeft)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
while (IsLeft ? (index < boun && (a[index + 1as IComparable<T>).CompareTo(m) <= 0) : (index > boun && (a[index - 1as IComparable<T>).CompareTo(m) > 0))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (IsLeft)
                    index
++;
                
else
                    index
--;
            }

            
return index;
        }

    }

}

 

转载于:https://www.cnblogs.com/takamachi660/archive/2009/08/05/1539840.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java多线程快速排序的基本思路如下: 1. 将待排序的数组分成两部分,每一部分都是一个子数组; 2. 对于每一个子数组,创建一个新的线程去进行递归排序; 3. 等待所有子线程执行结束后,将两个子数组合并成一个有序的数组。 下面是使用Java多线程实现快速排序的示例代码: ```java import java.util.concurrent.*; public class QuickSort { public static void quickSort(int[] array) { ExecutorService executor = Executors.newCachedThreadPool(); executor.execute(new QuickSortTask(array, 0, array.length - 1)); executor.shutdown(); try { executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } catch (InterruptedException e) { e.printStackTrace(); } } private static class QuickSortTask implements Runnable { private int[] array; private int left; private int right; public QuickSortTask(int[] array, int left, int right) { this.array = array; this.left = left; this.right = right; } @Override public void run() { if (left >= right) { return; } int i = left; int j = right; int pivot = array[(left + right) / 2]; while (i <= j) { while (array[i] < pivot) { i++; } while (array[j] > pivot) { j--; } if (i <= j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; i++; j--; } } if (left < j) { ExecutorService executor = Executors.newCachedThreadPool(); executor.execute(new QuickSortTask(array, left, j)); executor.shutdown(); } if (i < right) { ExecutorService executor = Executors.newCachedThreadPool(); executor.execute(new QuickSortTask(array, i, right)); executor.shutdown(); } } } } ``` 在这个示例代码中,我们使用了Java的线程池来管理线程,并且在每次递归时都创建了一个新的线程来处理子数组的排序。这种方法可以在一定程度上提高排序的速度,但是也会带来一些额外的开销和复杂度。因此,我们需要根据实际情况进行权衡和选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值