常用的几种排序算法,原理及源码。
1、冒泡排序
原理:它重复地走访过要排序的元素列,一次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。
2、选择排序
原理:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
3、快速排序
原理:快速排序(Quicksort)是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法继续对这两部分数据分别进行递归,以此达到整个数据变成有序序列。
//交换两数值
void swap(int *a, int *b);
//冒泡升序
void bubbleSort(int a[],int n);
//选择升序
void selectionSort(int a[], int n);
//快速升序
void quickSort(int a[] ,int start, int end);
int* mockRandArray(int size) {
if (size<=0) return NULL;
int *a;
a = (int *)malloc(sizeof(int)*size);
for (int i=0; i<size; i++) {
a[i] = arc4random_uniform(2000);
}
return a;
}
#define MAX_SIZE 2000
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
int *arr = mockRandArray(MAX_SIZE);
// bubbleSort(arr,MAX_SIZE);
// selectionSort(arr,MAX_SIZE);
quickSort(arr, 0, MAX_SIZE-1);
for (int i=0; i<MAX_SIZE; i++) {
printf("%d ",arr[i]);
}
printf("\n");
}
return 0;
}
//冒泡升序
void bubbleSort(int a[],int n) {
int i,j;
for (i=0; i<n-1; i++) {
for (j=0; j<n-i-1; j++) {
if (a[j]>a[j+1]) {
swap(&a[j], &a[j+1]);
}
}
}
}
//选择升序
void selectionSort(int a[], int n) {
int max,i,j;
for (i=0; i<n-1; i++) {
max = i;
for (j=i+1; j<n; j++) {
if (a[j]<a[max]) {
max = j;
}
}
if (max != i) {
swap(&a[i], &a[max]);
}
}
}
//快速升序
void quickSort(int a[] ,int start, int end) {
if (end<=start) return;
int i=start+1,j=end;
while (i<j) {
if (a[i]>a[start]) {
swap(&a[i], &a[j]);//后置大于start的数,即交换i&j
j--;
} else {
i++;
}
}
//此时数组被分为两部start+1 ~ i-1 < start 和 i+1 ~ end > start
if (a[i] >= a[start]) {
i--;
}
swap(&a[i], &a[start]);//交换start i
//继续递归排序
quickSort(a, start, i);
quickSort(a, j, end);
}
//交换两数值
void swap(int *a, int *b) {
int tmp = *a;
*a = *b;
*b = tmp;
}