一、冒泡排序
#include <stdio.h>
#define SWAP(x, y) x ^= y; y ^= x; x ^= y;
int main()
{
int arr[] = {6,5,4,7,8,3,2,9,0,1};
int ilen = sizeof(arr)/sizeof(int);
int i,j;
for(i=0; i<ilen; ++i)
{
for(j=0; j<ilen-i-1; ++j)
{
if(arr[j] > arr[j+1])
{
SWAP(arr[j], arr[j+1]);
}
}
}
for(i=0; i<ilen; ++i)
{
printf("%d ", arr[i]);
}
printf("\n");
}
二、选择排序
#include <stdio.h>
#define SWAP(x, y) x ^= y; y ^= x; x ^= y;
int main()
{
int arr[] = {5,6,7,4,3,8,9,2,1,0};
int ilen = sizeof(arr)/sizeof(int);
int i, j, pos;
for(i=0; i<ilen; ++i)
{
pos = i;
for(j=i; j<ilen; ++j)
{
if(arr[pos] > arr[j])
{
pos = j;
}
}
if(pos > i)
{
SWAP(arr[i], arr[pos]);
}
}
for(i=0; i<ilen; ++i)
{
printf("%d ", arr[i]);
}
printf("\n");
return 1;
}
三、直插排序
#include <stdio.h>
int main()
{
int arr[] = {5,6,4,7,8,3,2,9,0,1};
int ilen = sizeof(arr)/sizeof(int);
int i,j,k;
for(i=1; i<ilen; ++i)
{
k = arr[i];
for(j=i; j>0 && arr[j-1] > k; --j)
{
arr[j] = arr[j-1];
}
arr[j] = k;
}
for(i=0; i<ilen; ++i)
{
printf("%d ", arr[i]);
}
printf("\n");
}
四、希尔排序
#include <stdio.h>
int main()
{
int arr[] = {5,6,7,4,3,8,9,2,1,0};
int ilen = sizeof(arr)/sizeof(int);
int i,j,k,incr;
for(incr = ilen/2; incr>0; incr /= 2)
{
for(i=incr; i<ilen; i += incr)
{
k = arr[i];
for(j=i; j>0 && arr[j-incr] > k; j -= incr)
{
arr[j] = arr[j-incr];
}
arr[j] = k;
}
}
for(i=0; i<ilen; ++i)
{
printf("%d ", arr[i]);
}
printf("\n");
}
五、快速排序
//quicksort
#include <stdio.h>
void QSort(int arr[], int left, int right)
{
int privot = arr[left];
int i = left;
int j = right;
while(i<j)
{
while(i<j && arr[j] >= privot)
{
j--;
}
arr[i] = arr[j];
while(i<j && arr[i] <= privot)
{
i++;
}
arr[j] = arr[i];
}
arr[i] = privot;
if(left < right)
{
QSort(arr, left, i-1);
QSort(arr, i+1, right);
}
}
int main()
{
int arr[] = {5,6,7,4,3,8,9,2,1,0,2,4};
int ilen = sizeof(arr)/sizeof(int);
int i;
QSort(arr, 0, ilen-1);
for(i=0; i<ilen; ++i)
{
printf("%d ", arr[i]);
}
printf("\n");
return 1;
}
六、归并排序
//mergesort
#include <stdio.h>
//合并
void Merge(int arr[], int arrtmp[], int left, int center, int right)
{
int lpos = left; //左边一半下标位置
int rpos = center; //右边一半下标位置
int leftVerge = center - 1; //左边一半边界
int rightVerge = right; //右边一半边界
int tmppos = left; //合并后存入临时数组下标位置
int arrsize = right - left + 1; //当前合并长度
int i;
//依次合并
while(lpos <= leftVerge && rpos <= rightVerge)
{
if(arr[lpos] <= arr[rpos])
{
arrtmp[tmppos++] = arr[lpos++];
}
else
{
arrtmp[tmppos++] = arr[rpos++];
}
}
while(lpos <= leftVerge)
{
arrtmp[tmppos++] = arr[lpos++];
}
while(rpos <= rightVerge)
{
arrtmp[tmppos++] = arr[rpos++];
}
//copy
for(i=0; i<arrsize; ++i, ++left)
{
arr[left] = arrtmp[left];
}
}
//合并排序
void MSort(int arr[], int arrtmp[], int left, int right)
{
int center = (left + right) / 2;
if(left < right)
{
MSort(arr, arrtmp, left, center);
MSort(arr, arrtmp, center+1, right);
Merge(arr, arrtmp, left, center+1, right);
}
}
//主函数
int main()
{
int arr[] = {5,6,7,4,3,8,9,2,1,0,2,4};
int arrtmp[sizeof(arr)/sizeof(int)];
int ilen = sizeof(arr)/sizeof(int);
int i;
MSort(arr, arrtmp, 0, ilen-1);
for(i=0; i<ilen; ++i)
{
printf("%d ", arr[i]);
}
printf("\n");
return 1;
}
七、堆排序
#include <stdio.h>
#define SWAP(x, y) x ^= y; y ^= x; x ^= y;
#define LeftChild(i) ( 2 * (i) + 1 )
void PerDown(int arr[], int i, int ilen)
{
int Child;
int tmp;
for(tmp = arr[i]; LeftChild(i)<ilen; i = Child)
{
Child = LeftChild(i);
if(Child != ilen - 1 && arr[Child+1] > arr[Child])
{
Child++;
}
if(tmp < arr[Child])
{
arr[i] = arr[Child];
}
else
{
break;
}
}
arr[i] = tmp;
}
void HeapSort(int arr[], int ilen)
{
int i;
for(i=ilen/2; i>=0; --i)
{
PerDown(arr, i, ilen);
}
for(i=ilen; i > 0; --i)
{
SWAP(arr[0], arr[i]);
PerDown(arr, 0, i);
}
}
int main()
{
int arr[] = {5,6,7,4,3,8,9,2,1,0};
int ilen = sizeof(arr)/sizeof(int);
int i;
HeapSort(arr, ilen-1);
for(i=0; i<ilen; ++i)
{
printf("%d ", arr[i]);
}
printf("\n");
return 1;
}
附一:shell 直插排序
#!bin/bash
#insertsort
function main()
{
declare arr=(5 6 7 4 3 8 9 2 1 0 6 4);
declare ilen=${#arr[@]};
declare i;
declare j;
declare v;
declare k;
for((i=1; i<ilen; ++i))
do
v=${arr[$i]};
for((j=$i; j>0; --j))
do
if [ ${arr[($j-1)]} -lt $v ]; then
break;
fi
arr[$j]=${arr[$j-1]};
done
arr[$j]=$v;
done
echo ${arr[*]};
}
main
exit 0