起泡排序
void bubbleSort(Elem R[]){
int i,j;
i=n;
while(i>1){
int lastChangeIndex=n;
for(j=1;j<i;j++){
if(R[j]>R[j+1]){
swap(R[j],R[j+1]);
lastChangeIndex=j;
}
}
i=lastChangeIndex;
}
}
气泡排序总的时间复杂度是O(n²)
快速排序
快速排序是对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排序记录分割成两个独立的部分,其中一分部的关键字均比另一部分的关键字小,则可对这两部分记录继续进行排序,已达到整个序列有序。
//对顺序表R[1...n]做快速排序
void QuickSort(Elem R[],int n){
QSort(R,1,n);
}
//对顺序表R中的子序列R[low]~R[high]做快速排序
void QSort(Elem R[],int low ,int high){
if(low<high){ //长度大于1
pivotloc = partition(R,low,high); //将R[low...high]一分为二,pivotloc是枢轴位置
QSort(R,low,pivotloc-1); //对低子表递归排序
QSort(R,pivotloc+1,high); //对高子表递归排序
}
}
//一趟快速排序,即将R[low]~R[high]按照枢轴分割
int partition(Elem R[],int low ,int high){
R[0]=R[low]; //选择第一个元素作为枢轴
pivotKey = R[low].key; //记录枢轴的关键字
while(low<high){ //循环结束的条件是low=high,即找到枢轴的位置
while(low<high&&R[high]>=pivotKey)
high--;
R[low]=R[high]; //将小于枢轴的记录移动到前半部分
while(low<high&&R[low]<=pivotKey)
low++;
R[high]=R[low]; //将大于枢轴的记录移动到后半部分
}
R[low]=R[0]; //枢轴归位
return low; //返回枢轴位置
}
快速排序的时间复杂度为O(nlog n)。