本来昨天晚上就可以把快速排序发上去,没想到昨晚CSDN竟然维护,那么就只能在停电的情况下下用学校的卡的要死的网发这快速排序了,不停多好,停电了还得自己掏腰包买个充电台灯,装的好像像学霸一样,实际就是一个大学渣,我也就不JJYY,直接说快速排序的思想,我是这样理解的,用一个变量作为基准,在拿出i和j两个变量,分别从数组的两端开始,将比它大的放在后面,小的放在前面,后续用递归的思想完成,这个效率还是很赞的,平均时间的复杂度为o(nlogn),对于常规的排序算法我看了书上的总结,和大家分享一下
(1)当记录的规模小,直接插入排序较好,当直接选择移动的记录数少于直接插入时,应该选择直接选择排序
(2)看起来貌似记录初始状态有序,则应选用直接插入或者冒泡排序
(3)若记录比较大,大概扫一眼比较乱,果断上快速排序,没得商量,因为平均时间的复杂度为o(nlogn),时间最少
直接上代码吧
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void quicksort(int a[],int n) // 实现排序的函数
{
int i=0,j=n-1,k=a[i];
if(n-1>0) // 递归的终止条件
{
while(i<j) //每一趟排序的终止条件
{
while(i<j&&a[j]>k) //从左找第一个小于k的数
j--;
if(i<j)
a[i++]=a[j];
while(i<j&&a[i]<k) //从右找第一个大于k的数
i++;
if(i<j)
a[j--]=a[i];
}
a[i]=k; // 找到合适 的索引i存放K值
quicksort(a,i-1); // 左子序排序
quicksort(a+i+1,n-i-1); //右子序排序
}
}
int main() // 主函数
{
int array[100];
int i=0,n;
srand ( (unsigned)time (NULL) );
printf("请你输入要排序的个数: ");
scanf("%d",&n);
printf("随机产生%d个数: ",n);
for(i=0;i<n;i++)
{
array[i]=rand()%10+10; //产生10~20之间的数
printf("%d ",array[i]);
}
quicksort(array,n); // 实现排序的函数
printf("\n排序之后为:",n);
for(i=0;i<n;i++)
{
printf("%d ",array[i]);
}
printf("\n");
return 0;
}