快速排序
#include<iostream>
using namespace std;
int func( int arr[], int left, int right)
{
int temp = arr[left];
while (left < right)
{
while ((left < right) && (arr[right] >= temp))
{
right -= 1;
}
arr[left] = arr[right];
while ((left < right) && (arr[left] <= temp))
{
left += 1;
}
arr[right] = arr[left];
}
arr[left] = temp;
return left;
}
void quick_paixu( int arr[], int left,int right)
{
if (left < right)
{
int mid = func(arr, left, right);
quick_paixu(arr, mid + 1, right);
quick_paixu(arr, left, mid - 1);
}
}
int main()
{
int arr[9] = { 1,3,5,9,8,7,6,2,4 };
quick_paixu(arr, 0, 8);
for (int i = 0; i < 9; i++)
{
cout << arr[i] << ",";
}
}
def func(li,left,right):
temp=li[left]
while left<right:
while left<right and li[right]>=temp:
right=right-1
li[left]=li[right]
while left<right and li[left]<=temp:
left=left+1
li[right]=li[left]
li[left]=temp
return left
def quick_paixu(li,left,right):
if left<right:
mid=func(li,left,right)
quick_paixu(li, left, mid - 1)
quick_paixu(li,mid+1,right) //递归
li=[1,3,4,5,9,8,7,6,2]
print(li)
quick_paixu(li,0,len(li)-1)
print(li)
快速排序之所以比较快,是因为与冒泡排序相比,每次的交换时跳跃式的,每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O ( n 2 ) O(n^2)O(n 2 ),它的平均时间复杂度为O ( n log 2 n ) O(n\log_2n)O(nlog 2 n)。
实现快速排序的代码如下:
void Quick_Sort(int *arr, int begin, int end){ if(begin > end) return; int tmp = arr[begin]; int i = begin; int j = end; while(i != j){ while(arr[j] >= tmp && j > i) j--; while(arr[i] <= tmp && j > i) i++; if(j > i){ int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } } arr[begin] = arr[i]; arr[i] = tmp; Quick_Sort(arr, begin, i-1); Quick_Sort(arr, i+1, end); }