问题:
将给定数据元素按照从小到大排序
快速排序思路:
通过一趟排序将数据分成两个独立的部分,再分别对两部分数据快速排序(运用递归的思想)
完整程序:
#include <stdio.h>
#include <windows.h>
void quick_sort(int *array,int start,int end);
void show(int *array,int length);
int partition(int *array,int start,int end);
void main()
{
//给定数组元素
int array[] = {9,7,18,4,10,18,5,3,80,25};
//计算数组长度
int length = sizeof(array) / sizeof(array[0]);
//排序
quick_sort(array,0,length - 1);
//显示排序后数组内容
show(array,length);
system("pause");
return ;
}
int partition(int *array,int start,int end)
{
int key = array[start];//保存每次排序数组的第一个位置数据
while( start < end)
{
//从尾部数据开始和key比较,若key <= array[end]则不用交换数据,反之结束while循环
while(start < end && key <= array[end])
{
end--;
}
if(start < end)
{
//将判断array[end]放在array[start]处 end 处的位置现在没有存放数据,为空
array[start] = array[end];
start++; //start后移一位
}
//当key > array[start]时start继续后移,不用交换数据,反之while循环结束
while(start < end && key > array[start])
{
start++;
}
if(start < end)
{
//将array[start]的数据放在上次end的空位处,此时start位置为空
array[end] = array[start];
end--; //end前移一位
}
}
array[start] = key; //将第一个位置的值放在空位置上
return start; //将分割位置的下标返回
}
void quick_sort(int *array,int start,int end)
{
int flag ; //用于保存分割左右两边的数组下标
if(start < end)
{
flag = partition(array,start,end);
quick_sort(array,start,flag - 1); //左边排序
quick_sort(array,flag + 1,end); //右边排序
}
}
//输出数组内容
void show(int *array,int length)
{
printf("排序后的数组为:\n");
for(int i = 0;i < length;i++)
{
printf("%d\t",array[i]);
}
printf("\n");
}
测试结果:
结果分析:
按照程序执行步骤逐步解析
声明:此文章为学习笔记,如有侵权请联系删除。