程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 排序算法之快速排序,排序算法之排序

排序算法之快速排序,排序算法之排序

編輯:C#入門知識

排序算法之快速排序,排序算法之排序


快排定義:

  設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用數組的第一個數)作為關鍵數據,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。

基本思想:

快速排序采用的思想是分治思想。

快速排序是找出一個元素(理論上可以隨便找一個)作為基准(pivot),然後對數組進行分區操作,使基准左邊元素的值都不大於基准值,基准右邊的元素值 都不小於基准值,如此作為基准的元素調整到排序後的正確位置。遞歸快速排序,將其他n-1個元素也調整到排序後的正確位置。最後每個元素都是在排序後的正 確位置,排序完成。所以快速排序算法的核心算法是分區操作,即如何調整基准的位置以及調整返回基准的最終位置以便分治遞歸。

舉例說明一下吧,這個可能不是太好理解。假設要排序的序列為

2 2 4 9 3 6 7 1 5 首先用2當作基准,使用i,j兩個指針分別從兩邊進行掃描,把比2小的元素和比2大的元素分開。首先比較2和5,5比2大,j左移

2 2 4 9 3 6 7 1 5 比較2和1,1小於2,所以把1放在2的位置

2 1 4 9 3 6 7 1 5 比較2和4,4大於2,因此將4移動到後面

2 1 4 9 3 6 7 4 5 比較2和7,2和6,2和3,2和9,全部大於2,滿足條件,因此不變

經過第一輪的快速排序,元素變為下面的樣子

[1] 2 [4 9 3 6 7 5]

之後,在把2左邊的元素進行快排,由於只有一個元素,因此快排結束。右邊進行快排,遞歸進行,最終生成最後的結果。

class Program
{
    static void Main(string[] args)
    {
        int[] array = new[] { 234, 632, 23, 643, 2, 6, -2, 423, 2342, 43 };
        Console.WriteLine("排序前:");
        Console.WriteLine(string.Join(",", array));

        QuickSort(array, 0, array.Length - 1);

        Console.WriteLine("排序後:");
        Console.WriteLine(string.Join(",", array));
        Console.ReadKey();
    }
    
    /// <summary>
    /// 快速排序
    /// </summary>
    /// <param name="sources">目標數組</param>
    /// <param name="left">數組最小索引</param>
    /// <param name="right">數組最大索引</param>
    private static void QuickSort(int[] sources, int left, int right)
    {
        // 終止遞歸,排序完畢
        if (left > right) return;

        int pivot = sources[left], //基准數
            low = left,
            high = right;

        while (low < high)
        {
            // 從右往左遞減判斷
            while (low < high && sources[high] > pivot)
                --high;
            // 小於基准數的放在左邊
            sources[low] = sources[high];

            // 從左往右遞增判斷
            while (low < high && sources[low] < pivot)
                ++low;
            // 大於基准數的放在右邊
            sources[high] = sources[low];
        }
        // 一遍排序後,左邊都小於基准數,右邊都大於基准數
        sources[low] = pivot;

        // 分區遞歸
        QuickSort(sources, left, low - 1);
        QuickSort(sources, low + 1, right);
    }
}

 


c++快速排序算法代碼

你看百度百科吧,講得非常詳細:
baike.baidu.com/view/19016.htm
 

用快速排序算法,對下列數組排序

#include<iostream>
using namespace std;
int Por(int *ar,int l,int h){
int k=ar[l];
while(l<h){
while(l<h&&k<=ar[h])
h--;
ar[l]=ar[h];
while(l<h&&k>=ar[l])
l++;
ar[h]=ar[l];
}
ar[l]=k;
return l;
}
void QSort(int *ar,int l,int h,int n){
if(l<h){
int m=Por(ar,l,h);
for(int i=0;i<n;i++)
cout<<ar[i]<<" ";
cout<<endl;
QSort(ar,l,m-1,n);
QSort(ar,m+1,h,n);
}
}
int main(){
int n,*ar;
cin>>n;
ar=new int[n];
for(int i=0;i<n;i++)
cin>>ar[i];
QSort(ar,0,n-1,n);
return 0;
}
輸入:
8
60 56 65 99 22 16 88 100
輸出:
16 56 22 60 99 65 88 100
16 56 22 60 99 65 88 100
16 22 56 60 99 65 88 100
16 22 56 60 88 65 99 100
16 22 56 60 65 88 99 100
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved