趁着复习把课上的作业和代码上传上来嘿嘿嘿,这个系列的代码都是自己写的或者老师教学用的可能内存管理上有点小瑕疵,但是算法理解还是不错的!本系列所有代码在dev-cpp上可以跑通~
快速排序:
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
const int maxn=1000001;
int A[maxn];
int partition(int arr[], int low, int high) {
int i=low,j=high;
int p=arr[i];
while(i<j){
while(i<j&&arr[j]>=p){
j--;
}
if(i<j){
arr[i]=arr[j];
i++;
}
while(i<j&&arr[i]<=p){
i++;
}
if(i<j){
arr[j]=arr[i];
j--;
}
}
arr[i]=p;
return i;
}
void quickSort(int arr[], int low, int high) {
if(high<low){
int k=partition(arr,low,high);
quickSort(arr,low,k-1);
quickSort(arr,k+1,high);
}
}
int main() {
int n;
scanf( "%d", &n);
for (int i=0; i<n; i++) scanf("%d", &A[i]);
//srand((unsigned)time(NULL));
//swap(A[rand()%(n-1)],A[n-1]);
quickSort(A, 0, n-1);
for (int i=0; i<n; i++) printf("%d ", A[i]);
return 0;
}
快排的原理网上讲的比较多,我这就不写了,注意用到的是递归和分治的思想,然后快排最坏的情况的时间复杂度是O(n^2)刚好是排好序的情况,所以为了避免这些情况一般快排时先交换位置(随机快速排序),最好的时间复杂度是O(nlgn),平均时间复杂度是O(nlgn)。