快速算法是通过反复对产生的文件进行划分来实现的
时间复杂度:最坏情况的时间是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 [] { 65 , 70 , 75 , 80 , 85 , 60 , 55 , 50 , 45 , 32767 }; print(A, 9 ); quickSort(A, 0 , 9 ); 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();}