复杂度为n2的算法
/* 冒泡排序
* input int数组 length of 数组
* 输出 在int数组上原地排序
*/
void bubble(int a[], int n)
{
int i,j,temp;
for (i = 0; i < (n - 1); i++ )
for ( j= n - 1; j > i; j-- ) {
if (a[j] < a[j-1]) {
temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
}
/* 插入排序
* input int数组 length of 数组
* 输出 在int数组上原地排序
*/
void insertSort(int a[], int n)
{
int i,j,key;
for ( i = 1; i < n; i++) {
key = a[i];
for (j = i-1; j > -1; j--) {
if (a[j] > key)
a[j+1] = a[j];
else
break;
}//end of for 2
a[j+1] = key ;
printf("%d /n",j);
}//end of for 1
//printf("%d",n);
}
//插入排序的递归实现
void insertSortReCurse(int a[], int n)
{
if (n > 1) {
insertSortReCurse(a, n-1);
int i,j,key;
key = a[n-1];
for (j = n-2; j > -1; j--) {
if (a[j] > key)
a[j+1] = a[j];
else
break;
}//end of for 2
a[j+1] = key ;
// print(a,n);
//getchar();
}
}
复杂度为nlogn的算法
/* 合并排序
* input int数组 length of 数组
* 输出 在int数组上原地排序
*
* 两个函数 merge 是主函数递归的将数组划分
*
* mergesort 将两个排过序的数组合并
* 错误:if ( i == p - b +1 ) 写成 if ( i = p - b +1 )
*/
void mergeSort(int a[],int b, int e, int p)
{
// printf("b = %d p = %d e = %d/n", b ,p,e);
int t1[p - b +1] ;
int t2[e - p] ;
int i,j,k;
for (i = 0; i < (p - b +1); i++ )
t1[i] = a[b+i];
for (i = 0; i < (e - p); i++ )
t2[i] = a[p+1+i];
// print(t1 ,p - b +1 );printf("[%d]/n",p - b +1);
// print(t2 ,e-p );printf("[%d]/n",e-p);
i = 0;
j = 0;
k = b;
while ( (i < (p - b +1)) && (j < (e - p)) ) {
if ( t1[i] > t2[j] )
a[k++] = t2[j++];
else
a[k++] = t1[i++];
}
if ( i == (p - b +1) )
while(j < (e - p) )
a[k++] = t2[j++];
else
while(i < (p - b +1) )
a[k++] = t1[i++];
// print(a ,10);
}
/*
* b : start of under
* e : end of under
*/
void merge(int a[] ,int b, int e)
{
// printf("%d%d");
if (b < e) {
int p = (b + e) / 2;
merge(a, b, p );
merge(a, p + 1 , e );
mergeSort(a, b, e, p);
}
}
/* quicksort
*
* 先排序 再分开
* b : start of under
* e : end of under
*/
int quickSort(int a[], int b , int e)
{
int key = a[e] ;
int i,j,temp;
i = b;//i 是用来指向最后大于key的序数
j = b;//j 是用来找到小于key 的序数
while ( j < e ) {
if ( key <= a[j] ) {
j++;
}
else {
temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j++;
}
}
temp = a[i];
a[i] = a[j];
a[j] = temp;
return i;
//print(a,10);
// getchar();
}
void quick(int a[], int b ,int e)
{
if ( b < e) {
int q = quickSort(a , b , e );
quick(a, b ,q-1);
quick(a, q+1 , e);
}
}
/* heap sort
* 教训: 儿子父亲的下标关系搞清楚 i 2*i+1 2*i+2
* heapDown 时 比较儿子父亲最大值时注意
* 建最小堆时 交换的对象。
* 注意建立思维模型。
*
* n 为 数组长度
*/