1.经典快速快速排序:
时间复杂度不稳定 时间复杂度:O(N*logN)~O(N2)
1.经典快排的实现逻辑:
- 先从数列中取出一个数作为基准数(通常取最后一个数)。
- 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
- 再对左右区间重复第二步,直到各区间只有一个数。
代码实现:
/*
快速排序 ,借鉴03-荷兰国旗问题,提高效率
*/
#include<iostream>
using namespace std;
void swap2(int arr[], int L, int R)
{
int temp=arr[L];
arr[L] = arr[R];
arr[R] = temp;
}
int* Partition(int arr[], int L, int R)
{
int less = L - 1;
int more = R;
int *arr1=new int[2] ;
while (L < more)
{
if (arr[L] < arr[R])
swap2(arr, ++less, L++);
else if (arr[L] > arr[R])
swap2(arr, --more, L);
else
L++;
}
swap2(arr, more, R);
arr1[0] = less + 1;
arr1[1] = more;
//cout << arr[0] << arr[1];
return arr1;
}
void quickSort(int arr[], int L, int R)
{
if (L < R)
{
int *arr1;
arr1= Partition(arr, L, R);
quickSort(arr, L, arr1[0] - 1);
quickSort(arr, arr1[1] + 1,R );
}
}
void PrintArray(int arr[], int legth)
{
for (int i = 0; i < legth; i++)
{
cout << arr[i] << ' ';
}
cout << endl;
}
int main()
{
int arr[10] = { 1,3,2,4,6,5,9,8,7,6 };
quickSort(arr, 0, 9);
PrintArray(arr, 10);
system("pause");
return 0;
}
2.随机快排
随机快排的时间复杂度:O(N*logN)
就是改在Partition函数中加入:
int i = rand() % (R - L + 1) + L;//随机一个数组的下标 swap2(arr, i, R);//交换i位置和最右边数组的元素
这就是随机快排和经典快排在code上的差别。
/*
快速排序 ,借鉴03-荷兰国旗问题,提高效率
*/
#include<iostream>
using namespace std;
void swap2(int arr[], int L, int R)
{
int temp = arr[L];
arr[L] = arr[R];
arr[R] = temp;
}
int* Partition(int arr[], int L, int R)
{
int less = L - 1;
int more = R;
int *arr1 = new int[2];
int i = rand() % (R - L + 1) + L;//随机一个数组的下标
swap2(arr, i, R);//交换i位置和最右边数组的元素
while (L < more)
{
if (arr[L] < arr[R])
swap2(arr, ++less, L++);
else if (arr[L] > arr[R])
swap2(arr, --more, L);
else
L++;
}
swap2(arr, more, R);
arr1[0] = less + 1;
arr1[1] = more;
//cout << arr[0] << arr[1];
return arr1;
}
void quickSort(int arr[], int L, int R)
{
if (L < R)
{
int *arr1;
arr1 = Partition(arr, L, R);
quickSort(arr, L, arr1[0] - 1);
quickSort(arr, arr1[1] + 1, R);
}
}
void PrintArray(int arr[], int legth)
{
for (int i = 0; i < legth; i++)
{
cout << arr[i] << ' ';
}
cout << endl;
}
int main()
{
int arr[10] = { 1,3,2,4,6,5,9,8,7,6 };
quickSort(arr, 0, 9);
PrintArray(arr, 10);
system("pause");
return 0;
}