您的位置:首页 > 其它

排序算法之 —— 快速排序(五)

2016-07-16 22:57 399 查看
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#define   len   10

void Show(int str[],int length);
void Quick_sort(int str[],int length);
void quick_sort(int str[],int left,int right);
using namespace std;
void Show(int str[],int length)
{
int i;
for(i = 0;i <length ;i++)

{
printf("  %d",str[i]);
}

}
void quick_sort(int str[],int left,int right)
{
if(left < right)
{
int  i  = left;
int j = right;
int  value  = str[left];
while( i < j)
{

while(i < j && str[j]  >= value)
{
j--;
}
if(i <j)
{
str[i++] = str[j];

}
while(i <j && str[i] <= value )
{

i++;
}
if(i < j)
{
str[j--] = str[i];

}

}
str[i]  = value;
quick_sort(str,left,i - 1);
quick_sort(str,i+1,right);

}
}
void Quick_sort(int str[],int length)
{
quick_sort(str,0,length);

}
int main()
{
int str[len];
int i ;
for(i  = 0; i < len; i++)
{
str[i]  = rand()%100;
}
printf("排序前:\n");
Show(str,len);
printf("\n");
printf("排序后:\n");
Quick_sort(str,len);
Show(str,len);
return 0;
}

排序前:
41  67  34  0  69  24  78  58  62  64
排序后:
0  24  34  41  58  62  64  67  69  78Press any key to continue


程序解读:

41  67  34  0  69  24  78  58  62  64

1.挖空位      value = str[left]
i = left   ;    j  = right
2. j--  由后向前找比他小的数,找到之后挖出此数填在前一个
坑中str[i]
3 . i++  由前向后找比他大的数,找到后,也将它填在前一个坑中
str[j]
4 .再重复 2 3 步 ,直至  i  == j    ,将基数填在str[i]
5,进行分治算法
递归调用:
quick(str ,left,i-1);
quick_sort(str,i+1,right)

可以看出,经过一次后,基数前的都比它小,基数后的都比它大

41  67  34  0  69  24  78  58  62  64
1 .value  str[0]  = 41
__  67  34  0  69  24  78  58  62  64
i                                 j

2.  j--     找比41 小的数   24    ---->  下标 5
将  str[0]  = str[5] = 24   str[5]形成新的空位
i++;

24  67  34  0  69  __  78  58  62  64
i              j
3.   i++   找比41 大的数  67        ----->  下标 1
将   str[5] =  str[1]  =  67   str[1]   形成新坑
j--
24  __  34  0  69  67  78  58  62  64
i          j

4   j--   找比41 小的数  0    ---->   下标  3
将   str[1]  = str[3]  = 0   str[3]   形成新坑
i++
24 0  34  __  69  67  78  58  62  64
i    j

5.  i++  找比41 大的数    while(i  == j)
退出  将基数填入坑中
24   0   34   **41**   69    67    78   58    62    64

可见   基数前的都比它小,基数后的都比它大

最后
进行分治算法
递归调用:
quick(str ,left,i-1);
quick_sort(str,i+1,right)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息