选择排序
插入排序
快速排序(递归实现)
qsort(实现快排非递归)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 500000
#define SWAP(a,b) {int tmp;tmp=a;a=b;b=tmp;}//宏里面实现交换,而且效率比较高
void arrPrint(int *arr);//打印
void arrSelect(int *arr);//选择排序,一轮比较完后才交换
void arrInsert(int *arr);//插入排序,
void arrQuick(int *, int, int);//快排
void arrShell(int *arr);//希尔排序
int partition(int *arr, int left, int right);//分割函数
int compare(const void* left, const void* right)
{
int* p1 = (int*)left;
int* p2 = (int*)right;
return *p1 - *p2;
}
int main()
{
int i;
int *arr=(int*)malloc(sizeof(int)*N);
time_t start, end;
srand(time(NULL));
for (i = 0; i < N; i++) {
arr[i] = rand() % 100;
}
// arrPrint(arr);
start = time(NULL);
//arrSelect(arr);//选择排序 从大到小排序
//arrInsert(arr);//插入排序 从小到大
//arrShell(arr);//希尔排序 从小到大
//arrQuick(arr,0,N);//快排 递归??????????????
qsort(arr, N, sizeof(int), compare);//非递归的快排
end = time(NULL);
// arrPrint(arr);
printf("arrQuick:use time=%d\n", end - start);
}
void arrPrint(int *arr)
{
int i;
for (i = 0; i < 10; i++) {
printf("%3d ", arr[i]);
}
printf("\n");
}
//选择排序
void arrSelect(int *arr)
{
int i, j, maxPos;
for (i = N; i > 1; i--) {//外层控制无序数数目
maxPos = 0;//
for (j = 1; j < i; j++)
{
if (arr[j] < arr[maxPos])//从小到大排序,如果从大到小只需要,改变为<号
{
maxPos = j;//记住最大值位置
}
SWAP(arr[maxPos], arr[i - 1]);//宏
}
}
}
//插入排序
void arrInsert(int *arr)
{
int i, j, insertValue;
for (i = 1; i < N; i++)
{
insertValue = arr[i];
for (j = i - 1; j >= 0; j--)
{
if (arr[j] > insertValue)
{
arr[j + 1] = arr[j];
}
else {
break;
}
}
arr[j + 1] = insertValue;
}
}
//希尔排序 不怎么重要
void arrShell(int *arr)
{
int i, j, insertValue, gap;
for (gap = N >> 1; gap > 0; gap = gap >> 1) {//gap>>=1;右移
for (i = gap; i < N; i++)
{
insertValue = arr[i];
for (j = i - gap; j >= 0&&arr[j]>insertValue; j=j-gap)
{
arr[j + gap] = arr[j];
}
arr[j + gap] = insertValue;
}
}
}
int partition(int *arr, int left, int right)
{
int i, k;
for (i = left, k = left; i < right; i++)
{
if (arr[right] > arr[i])
{
SWAP(arr[i], arr[k]);
k++;
}
}
SWAP(arr[k], arr[right]);
return k;
}
//快排
void arrQuick(int *arr, int left, int right)
{
int pivot;//分割点
if (left < right)
{
pivot = partition(arr, left, right);
arrQuick(arr, left, pivot - 1);
arrQuick(arr, pivot + 1, right);
}
}