获取随机数,用于测试排序
需包含 stdlib.h
和time.h
int * getrand(int min, int max, int len)
{
int* arr = (int*)malloc(sizeof(int)*len);
srand(time(NULL));
for(int i=0; i<len; ++i) {
arr[i] = rand()%(max-min+1) + min;
printf("%d ",arr[i]);
}
printf("
");
return arr;
}
- 冒泡:基本不用,太慢,要两两交换次数太多。
- 选择:基本不用,慢而且不稳。
- 插入:样本小且基本有序的时候效率较高。
冒泡排序
void bubbleSort(int a[], int n)
{
for(bool sorted=false; !sorted; --n) {
sorted = true; // 每趟循环前都假定已经排序
for(int i=1; i<n; ++i)
if(a[i-1] > a[i]) { // 一旦相邻元素是逆序
swap(a[i-1],a[i]);
sorted = false; // 发现局部逆序,显然不是排序好的
}
}
}
选择排序
最好和最差都是 (O(n^2)) 不稳定
void selectionSort(int *arr,int len)
{
int minPos = 0;
for(int i=0;i<len-1;i++) {
minPos = i; // 内层开始先假设最小值在外层起始处
for(int j=i+1;j<len;j++) // 不断地做比较,如果有更小地就更新最小值地位置
minPos = arr[j] < arr[minPos] ? j : minPos;
// 每一趟下来总是可以选出最小值的位置,然后和最前面的进行交换
swap(arr,i,minPos);
}
}
插入排序
void insertionSort(int * arr,int n)
{
for(int i=1; i<n; i++) { //从第二个位置开始
for(int j=i; j>0 && arr[j]<arr[j-1]; j--)
swap(arr,j,j-1); //如果该位置比前面的小,就不断挪(即插入)到前面合适位置
}
}
先挪出空位置,再插入
void insertionSort2(int * arr,int n)
{
int tmp,j;
for(int i=1; i<n; i++) { //从第二个位置开始
if(arr[i] < arr[i-1]) {
tmp = arr[i]; // 保存位置
for(j=i; j>0 && arr[j-1]>tmp; j--)
arr[j] = arr[j-1]; //前面地值比tmp大的则后挪
arr[j] = tmp; // 空出来的位置插入tmp
}
}
}
快速排序
void q_sort(int v[], int left, int right)
{
if(left >= right) // 若数组包含的元素少于两个
return ;
int last = left; // 设左边元素为子集划分元素
for(int i=left+1; i<=right; i++) // 划分子集
if(v[i] < v[left])
swap(v, ++last, i);
swap(v, left, last); //回复划分子集的元素
q_sort(v,left,last-1);
q_sort(v,last+1,right);
}