快排算法问题

快排问题

今天又复习了下快速排序,主要思想是先把数组的最左边的这个数作为一个基准数,然后在通过类似二分法把大于基准数的数放在右边,小于基准数的数放在左边。这就是其主要思想。
c++代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int a[11];
void quick_sort(int begin,int end)
{
   //temp作为基准数 
   int temp = a[begin];
   int i = begin;
   int j = end;
   
   if(begin > end)
   return;
   
   while(i < j)
   {
    while(a[j] >= temp && i < j)
      {
       j --; 
      }
     while(a[i] <= temp && i < j)
     {
     i ++;
     }
     if(i < j)
     {
     int t = a[i];
       a[i] = a[j];
       a[j] = t;
     }
  }
   
   //把基准数放到它的位置 
   a[begin] = a[i];
   a[i] = temp;
   
  quick_sort(begin,i - 1);
  quick_sort(i + 1,end); 
}
int main()
{
   int n;
   cin >> n;
   for(int i = 1; i <= n; i ++ )
    scanf("%d",&a[i]);
   quick_sort(1,n);
   for(int i = 1; i <= n; i ++)
    cout << a[i] << " ";
   return 0;
}

这里得注意的一点是你必须从右边开始进行判断从而 j- -,假设你从左边开始的话,当你找到大于基准数的数时,你就得使基准数与你找到的这个数进行交换,而我们快排的思想是使小于基准数的数放在左边,违背了基本思想。则可能会出现问题。而从右边开始,即使找到一个小于基准数的数,进行交换也无大碍。

发布了26 篇原创文章 · 获赞 0 · 访问量 1365

猜你喜欢

转载自blog.csdn.net/weixin_43846217/article/details/104072593
今日推荐