1、
for (i=0;i<len;i++)
{
for (j=i+1;j<len;j++)
{
if (a[j]<a[i])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
2、冒泡排序
比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。
for (int j = 0; j < n - 1; j++) // 每次最大元素就像气泡一样"浮"到数组的最后
{
for (int i = 0; i < n - 1 - j; i++) // 依次比较相邻的两个元素,使较大的那个向后移
{
if (A[i] > A[i + 1]) // 如果条件改成A[i] >= A[i + 1],则变为不稳定的排序算法
{
Swap(A, i, i + 1);
}
}
}
3、快速排序
快速排序使用分治策略(Divide and Conquer)来把一个序列分为两个子序列。步骤为:
- 从序列中挑出一个元素,作为"基准"(pivot).
- 把所有比基准值小的元素放在基准前面,所有比基准值大的元素放在基准的后面(相同的数可以到任一边),这个称为分区(partition)操作。
- 对每个分区递归地进行步骤1~2,递归的结束条件是序列的大小是0或1,这时整体已经被排好序了。
#include<stdio.h> void Quiksort(int *a, int low, int high) { int pos; if (low < high) { pos = FindPos(a, low, high); Quiksort(a, low, pos - 1); Quiksort(a, pos + 1, high); } } int FindPos(int * a, int low, int high) { int val = a[low]; while (low < high) { while (low < high && a[high] > val) { --high; } a[low] = a[high]; while (low < high && a[low] <= val) ++low; a[high] = a[low]; }//终止循环时low和high一定时相等的 a[low] = val; return high; //high和low的值一样,随便返回一个就可以。 } int main() { int a[10] = { 2,4,1,-10,46,32,87,3,4,5 }; int i; Quiksort(a, 0, 9);//第二个元素表示第一个元素的下标,第三个元素表示最后一个元素的下标 for (i = 0; i<10; i++) { printf("%d\n", a[i]); } }