快速排序演算法詳細講解c++版
快速排序演算法
1.首先我需要對快速排序演算法下個定義:什麼是快排呢?或者是排序的指導思想比如一個待排序的陣列
int iArray[] = {5,4,45,878,45}; 我們需要把這個陣列從小到大進行排序。
我們首先需要找到一個引數軸 也就是引數的資料 有了參考資料我們就把資料分成2個部分,一個數據全部是大於或者等於當前參考資料,另一部分資料都是小於或者等於當前參考資料的。
下面分析快排演算法的執行過程。 假如開始我們得到一個參考數值是第一個也就piovt = 5
這個時候我們的目的就是要實現5這個數的右邊都是大於或者等於他,反之左邊都是小於或者等於他的
我們是採用2個索引指示器int leftIndex = 0; 這個指示器我們開始是儲存了第一個元素
int rightIndex = 4 儲存了陣列中最後一個數據 首先我們會把這個piovt軸值先儲存下來,這樣當前軸對應的記憶體區域就可以被其他資料覆蓋了。 這個時候由於我們右端都是大於5的數,因此我們第一趟快排可以先從右邊找到一個小於5的數 然後儲存在當前piovt空出來的位置。 比如我們找到的資料就是4 這個時候我們就把4寫入到5這個位置去了,這個時候leftIndex++操作這個5提前儲存在了臨時piovt變數中,不用擔心被覆蓋,這個時候4位置的記憶體資料就可以被覆蓋了。 現在我們在從左邊也就是leftIndex指示的位置開始找一個比5要大的資料 這個時候我從索引為1開始找
這個時候注意 我們從右邊和左邊找的索引已經相當因此這輪查詢操作完畢 什麼意思就是說我們當前這個資料已經被調整過,不能重複去調整
第一輪排序之後得到的陣列就是4 4 45 878 45 索引1對應的內容是可以被覆蓋的 5的那個值被提前儲存在了piovt中
現在開始第二輪排序 這個時候的leftIndex =1 rightIndex = 1 我們這個時候發現左右指示器已經相等了,說明右邊的資料都是大於5的了 左邊的資料都已經小於5了
那麼我們就可以把這個軸值寫入到當前的空位中 也就是索引為1 這個時候陣列就變成了
4 5 45 878 45 我們發現5兩邊的資料大小的規則是符號我們需要的
這個時候5已經把資料分成2部分了 這個時候我在用遞迴 我們專門針對 4 和 45 878 45 這2部分分別在進行快排。 其實在快排之前我們需要做個判斷資料是不是大於1 否則就沒有必要在排序了
下面來上具體程式碼
#include "stdafx.h"
#include<iostream>
void QuickSort(int iArray[],int left, int right)
{
//快速排序之前先判斷一下當前待排序陣列元素個數是不是大於1 否則就沒有必要排序
if (left >= right)
{
//直接退出排序程式碼 沒有必要進行排序了
return;
}
//開始進行快排演算法
//首先我們先儲存left索引對應的資料 當前資料作為切割陣列的軸
int piovt = iArray[left];
//定義臨時變數儲存陣列2端的索引
int leftIndex = left;
int rightIndex = right;
while (leftIndex < rightIndex)
{
//現在我們通過迴圈從右邊開始搜尋一個比軸值小的資料
while (leftIndex < rightIndex)
{
//如果右邊的數大於當前的引數軸值
if (piovt <= iArray[rightIndex])
{
//右端索引指示器左移
rightIndex--;
}
else
{
//說明我們右端出現比軸值更大的資料
//這個時候我們就可以把這個更大的資料填充到索引軸索引對應的地方
iArray[leftIndex] = iArray[rightIndex];
leftIndex++;
//我們需要跳出迴圈了當前工作完畢
break;
}
}
//從左邊開始搜尋一個比軸值更大的數填寫上次留下的坑
while (leftIndex < rightIndex)
{
//如果左邊的資料小於軸值 我們索引指示器就往右走
if (piovt >= iArray[leftIndex])
{
leftIndex++;
}
else
{
//說明我們在左端找到了比軸值更大的資料
iArray[rightIndex] = iArray[leftIndex];
rightIndex--;
break;
}
}
}
iArray[leftIndex] = piovt;
QuickSort(iArray, left, leftIndex - 1);
QuickSort(iArray, rightIndex + 1, right);
}
int main()
{
int arry[] = { 3,21,87,1,21,10 };
QuickSort(arry, 0, 5);
for (int i = 0; i < 6; i++)
{
std::cout << arry[i] << std::endl;
}
return 0;
}
快速排序演算法的時間複雜度分析:……..