1、算法介紹(直接百度吧。。。):設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用數組的第一個數)作爲關鍵數據,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱爲一趟快速排序。值得注意的是,快速排序不是一種穩定的排序算法,也就是說,多個相同的值的相對位置也許會在算法結束時產生變動。對排序數組進行排序,需要經過n趟快速排序,一趟快速排序的算法如下:
#include <iostream>
#include <cstdlib>
#include <ctime>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void quickSort(int theArray[], int left, int right)
{
if(left >= right)
return;
int key = theArray[left];
int tmp;
int i,j;
for(i = left,j = right; i!=j;)
{
while(key <= theArray[j] && i != j)
{
j--;
}
if(key > theArray[j])
{
tmp = theArray[j];
theArray[j] = theArray[i];
theArray[i] = tmp;
}
while(key >= theArray[i] && i != j)
{
i++;
}
if(key < theArray[i])
{
tmp = theArray[i];
theArray[i] = theArray[j];
theArray[j] = tmp;
}
}
int left_1 = left;
int right_1 = i-1; //i == j,且指向key的位置
int left_2 = i+1;
int right_2 = right;
quickSort(theArray, left_1, right_1);
quickSort(theArray, left_2, right_2);
}
void printArray(int theArray[], int n)
{
for(int i = 0; i < n; i++)
std::cout << theArray[i] << " ";
std::cout << std::endl;
}
int main(int argc, char *argv[]) {
int myArray[30];
int length = 30;
//int length = sizeof(myArray) / sizeof(myArray[0]);
srand(time(NULL));
for(int i = 0; i < length; i++)
{
myArray[i] = rand() % 71 + 30; //30~100中的隨機數
}
std::cout << "before sort: " << std::endl;
printArray(myArray, length);
quickSort(myArray, 0, length-1);
std::cout << "quick sort: " << std::endl;
printArray(myArray, length);
return 0;
}
3、時間複雜度和空間複雜度
(1)時間複雜度
最好時間複雜度:O(nlogn)
最差時間複雜度:O(n^2)
平均時間複雜度:O(nlogn)
(2)空間複雜度
最好空間複雜度:O(logn)
最差空間複雜度:O(n)