1.起泡排序
起泡排序的原理非常的简单,它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
算法描述:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个;
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的元素;
3.针对所有元素重复以上的步骤,除了最后一个;
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较;
算法演示:
-
/*
-
**起泡排序 时间复杂度O(n^2)
-
*/
-
void BubbleSort(int a[], int len)
-
{
-
int i, j;
-
for(i = 0; i < len; ++i){
-
for(j = i+1; j < len; ++j){
-
if(a[i] > a[j]){
-
int temp = a[i];
-
a[i] = a[j];
-
a[j] = temp;
-
}
-
}
-
}
-
}
2.快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
算法描述:
1.从数列中挑出一个元素(通常第一个元素)作为基准数;
2.分区过程,将比基准数大的放到右边,小于或等于它的数放到左边;
3.在对左右区间递归执行第二步,直至各区间只有一个数
动画演示:
算法演示:
-
/*
-
**快速排序实现
-
*/
-
int Partition(int a[], int low, int high)
-
{
-
int pivotkey = a[low];
-
while(low<high){
-
if(low<high && a[high]>=pivotkey)
-
--high;
-
a[low] = a[high];
-
if(low<high && a[low]<=pivotkey)
-
++low;
-
a[high] = a[low];
-
}
-
a[low] = pivotkey;
-
return low;
-
}
-
-
void QSort(int a[], int low, int high)
-
{
-
if(low < high){
-
int position = Partition(a, low, high);
-
QSort(a, low, position-1);
-
QSort(a, position+1, high);
-
}
-
}
3.example code:
-
int main()
-
{
-
int i;
-
int a[] = {80, 93, 60, 12, 42, 30, 68, 85, 10};
-
-
printf("起泡排序:\n");
-
BubbleSort(a, sizeof(a)/sizeof(a[0]));
-
for(i = 0; i < sizeof(a)/sizeof(a[0]); ++i)
-
printf("%d ", a[i]);
-
printf("\n");
-
-
printf("快速排序:\n");
-
QSort(a, 0, sizeof(a)/sizeof(a[0]));
-
for(i = 0; i < sizeof(a)/sizeof(a[0]); ++i)
-
printf("%d ", a[i]);
-
printf("\n");
-
-
return 0;
-
}
4.下面为七种经典排序算法指标对比情况:
阅读(2206) | 评论(0) | 转发(0) |