关闭

快速算法演示

801人阅读 评论(0) 收藏 举报

 快速算法是通过反复对产生的文件进行划分来实现的

时间复杂度:
最坏情况的时间是O(n2)
平均情况的时间是O(nlogn)

空间复杂度:
当n>1  S(n)=2+S(|_(n-1)/2_|)
当n<=1 S(n)=0

(C#)源代码 quicksort.cs

using System;
using System.Text;

namespace cn.blog8s
{
    
/// <summary>
    
/// 快速分类算法演示
    
/// </summary>
    public class BINSRCH
    {
        
static void Main()
        {
            
int[] A = new int[] { 65707580856055504532767 };
            print(A, 
9);
            quickSort(A, 
09);
            Console.Write(
"请输入一个大于1且小于9的数: ");
            
int k = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine(
"" + k + "小元素是:" + A[select(A, 9, k - 1)]);
            Console.Read();
        }

        
private static int partition(int[] a,int m,int p)
        {
//划分集合算法 
            int v = a[m];//划分元素
            int i = m;
            
int sum = p;
            
int temp;
            
while (true)
            {
                
do
                {
                    i
++;
                }
                
while (a[i]<v);//找一个比划分元素大的元素
                do
                {
                    p
--;
                }
                
while (a[p]>v);//找一个比划分元素小的元素
                if (i < p)
                {
                    temp 
= a[i]; a[i] = a[p]; a[p] = temp;//用上面找出来的值来交换
                }
                
else
                {
                    
break;
                }
            }
            a[m] 
= a[p]; a[p] = v;//把划分元素和右半部分最小的值交换
            Console.Write("本次划分元素:"+a[p]+"   ");
            print(a, 
9);
            
return p;//p是快速分类划分元素的下标a[p]是第p小的值,划分元素是位置不用变了
        }


        
private static void quickSort(int[] a,int p,int q)
        {
//快速分类算法
            int j;
            
if (p < q)
            {
                j 
= partition(a, p, q+1);//j是返回的划分元素的位置 参数q+1很关键记得要加1哦
                quickSort(a, p, j - 1);
                quickSort(a, j 
+ 1, q); 
            } 
        }

        
private static int select(int[] a,int n,int k)
        {
//选择算法
            int N = n;
            
int m = 0;
            
int j;
            Console.WriteLine(
"选择问题算法开始执行");
            
do
            {                
                j
=partition(a,m,N);
                
if (j == k)
                {
                    
break;
                }
                
else if (k < j)
                {
                    N 
= j;
                }
                
else
                {
                    m 
= j + 1;
                }
            }
            
while (true);
            
return j;
        }

        
private static void print(int[] a,int sum)
        {
//打印用
            for (int i = 0; i < sum; i++)
            {
                Console.Write(a[i]
+" ");
            }
            Console.WriteLine(
"");
        }

    }

}

 

(c++)源代码 quicksort.cpp (这个代码没有包含选择算法)

#include <stdlib.h>
#include 
<iostream.h>

int a[]={65,70,75,80,85,60,55,50,45,32767};
void print()
{
    
for (int i=0;i<9;i++)
    {
        cout
<<a[i]<<" ";
    }
    cout
<<endl;

}
int partition(int m,int p)
{
    
int i,j,k;
    
int v;
    
int temp;
    v
=a[m];
    i
=m;
    j
=p;
    
while (i<j)
    {
        
do 
        {
            i
++;
        }
        
while (a[i]<v);
        
        
do
        {
            j
--;
        }
        
while (a[j]>v);

        
if (i<j)
        {
          temp
=a[i];
          a[i]
=a[j];
          a[j]
=temp;
        }
    }
    a[m]
=a[j];
    a[j]
=v;
    print();
    
return j;
}

void quicksort(int p,int q)
{
    
int i;
    
int j;
    i
=p;
    j
=q;
    
if (i<j)
    {
        j
=q+1;
    j
=partition(i,j);
    quicksort(i,j
-1);
    quicksort(j
+1,q);
    }
    
}

void main()
{
  quicksort(
0,9);
  print();
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:681066次
    • 积分:9304
    • 等级:
    • 排名:第2027名
    • 原创:206篇
    • 转载:100篇
    • 译文:16篇
    • 评论:204条
    最新评论