#include <stdio.h>
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
计数排序:
a[i]与后面的每个元素相比,若a[i]较大则Count[i]+1,否则对方+1
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
void rank_sort(int a[],int Count[],int s[],int n)
{
int i,j;
for (i = 0; i < n-1; i++)
for (j = i+1; j < n; j++)
if(a[i] < a[j]) Count[j]++;
else Count[i]++;
for (i = 0; i < n; i++)
s[Count[i]] = a[i];
}
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
选择排序(下划线为即时终止算法应加上的部分):
找出最大元素并放到最后,剩下的找出最大者放到倒数第二的位置...
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
Void selection_sort(int a[],int n)
{
int i,j,pos,t,sorted=0;
for (i = n-1; i > 0 && !sorted; i--)
{
pos = 0; sorted = 1;
for (j = 1; j <= i; j++)
{ if(a[j] > a[pos]) pos = j;
else sorted = 0; }
t = a[i]; a[i] = a[pos]; a[pos] = t;
}
}
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
冒泡排序(下划线为即时终止算法应加上的部分):
每个元素与相邻元素比较,若靠前者较大则两者交换
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
Void bubble_sort(int a[],int n)
{
int i,j,t,sorted=0;
for (i = n-2; i >= 0 && !sorted; i--)
{
sorted = 1;
for (j = 0; j <= i; j++)
if(a[j] > a[j+1])
{
t = a[j+1]; a[j+1] = a[j]; a[j] = t;
sorted = 0;
}
}
}
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
插入排序:
取出第i个元素,插入到前面已排好序的i-1个元素中,i从1...n-1循环
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
Void insertion_sort(int a[],int n)
{
int i,j,t;
for (i = 1; i < n; i++)
{
t = a[i];
for (j = i-1; j >= 0 && t < a[j]; j--)
a[j+1] = a[j];
a[j+1] = t;
}
}
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
快速排序、查找第k个元素(在快排代码基础上加上下划线部分):
以第一个元素作为支点,在剩余元素中从左往右寻找比其大的元素,
同时从右往左寻找比其小的元素,交换两者,直到不存在可交换的元素,
把支点放到合适位置,支点左右的元素再递归排序
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
void quick_sort(int a[],int L,int R,int k)
{
int i = L/*从左到右的游标*/, j = R+1/*从右到左的游标*/, temp;
int p = a[L]; //以a[L]为支点
if (L >= R) { printf("%d",p); return; }
while(1) //把左侧>=支点p的元素与右侧<=支点p的元素进行交换
{
do {i = i + 1;} while(a[i] < p);
do {j = j - 1;} while(a[j] > p);
if(i >= j) break; //未发现交换对象
temp = a[j]; a[j] = a[i]; a[i] = temp; //否则交换
}
//结束循环时,a[j]为从左到右最后一个比支点小的元素,将其与支点交换
a[L] = a[j]; a[j] = p;
if(j+1 == k) {printf("%d",a[j]); return;}
if(j+1 > k) quick_sort(a,L,j-1,k); //递归对左段排序
else quick_sort(a,j+1,R,k); //递归对右段排序
}
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
void main() //各种排序算法的调用
{
int a[6] = {62,31,84,96,19,47};
int Count[6],s[6],i; for (i = 0; i < 6; i++) Count[i] = 0;
rank_sort(a,Count,s,6); // 计数排序,结果数组为s
selection_sort(a,6); // 选择排序
bubble_sort(a,6); // 冒泡排序
insertion_sort(a,6); // 插入排序
quick_sort(a,0,5); // 快速排序
}