快速排序
相较冒泡排序,快速排序更为高效,主要在于冒泡排序是两两进行比较,而快速排序是在你所要进行排序的序列中寻找一个基准数,然后将序列进行排序,使序列左边都是小于该基准数的,序列右边都是大于该基准数的;序列左右两边别作为子序列,在进行同样操作,直到不可拆分出新的子序列为止。简单地说就像站队一样,找个人当基准,然后比他矮的都在左边,高的都站右边。
- 例子: 30,22,15,64,89,70,85,32,11,15;10个数进行快速排序。
- 代码演示
#include<stdio.h>
int a[100], n; //定义两个全局变量
void quicksort(int left, int right)
{
int i, j, t, temp;
if(left > right)
return;
temp = a[left]; //temp中存的就是基准数
i = left;
j = right;
while(i != j)
{
while(a[j] >= temp && i < j) //从右往左,找寻比基准数大的。
j--;
while(a[i] <= temp && i < j) //从左往右,找寻比基准数小的。
i++;
if(i < j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
a[left] = a[i];
a[i] = temp;
quicksort(left, i - 1); //处理左边
quicksort(i + 1, right); //处理右边
return;
}
int main()
{
int i;
scanf("%d", &n); //读入你所要排序的数的数量。
for(i = 0; i < n; i++)
scanf("%d", &a[i]); //读入你所要排序的数。
quicksort(0, n - 1);
for(i = 0; i < n; i++)
printf("%d ", a[i]);
getchar();getchar();
return 0;
}
/*读入数据
* 10
* 30 22 15 64 89 70 85 32 11 15
* 输出结果为:11 15 15 22 30 32 64 70 85 89
*/
- 例题2:为建立一个图书角,而购进一批书,征集了学生的建议后,将学生想读的书的ISBN号记录下来,因同一本书只够买一本,即ISBN号只有一个(去重),第二还要将ISBN号进行排序,按从小到大的顺序进行排列,最后,程序运行时间要求为1秒钟。
- 解析所学三种排序算法中,桶排序最快,但是不知道ISBN号是多大的数字,所以桶排序PASS掉;冒泡排序在数量N,即多少本书有要求,如果超过100本,时间上就不如第三种快速排序了,所以在此使用排序算法更为合适。
- 代码示例:
因为代码近乎一样,所以只演示一部分
//在最后输出的时候,后面加两行代码。
if(a[i] != a[i-1])
printf("%d",a[i]);
//起到一个去重的目的。
网友评论