//快速排序算法
//打印数据
void print_list(int data_list[] , int left , int right)
{
for(int i = left ; i <= right ; i++)
{
printf("%5d " , data_list[i]);
}
printf("\n");
}
//核心排序(找到基准位置)[挖坑法]
int core_sort(int data_list[] , int left , int right)
{
int base = data_list[left];//基准
int i = left;
int j = right;
while(i < j)
{
while(i < j && data_list[j] >= base)
{
j--;
}
if(i < j )
{
data_list[i] = data_list[j]; //挖坑
}
while(i < j && data_list[i] <= base)
{
i++;
}
if(i < j )
{
data_list[j] = data_list[i]; //挖坑
}
}
data_list[i] = base;//基准找到了正确的位置
return i;
}
//快速排序(递归调用)
void quick_sort(int data_list[] , int left , int right)
{
if(left >= right)
return;
int base_pos = core_sort(data_list , left , right);
print_list(data_list , left , right);
//递归调用左右区间
quick_sort(data_list , left , base_pos - 1);
quick_sort(data_list , base_pos + 1 , right);
}
//快速排序(非递归调用)
void quick_sort_nor(int data_list[] , int left , int right)
{
std::stack<int> st;
if(left < right)
{
st.push(left);
st.push(right);
}
while(!st.empty())
{
int j = st.top();//right
st.pop();
int i = st.top();//left
st.pop();
int base_pos = core_sort(data_list , i , j );
print_list(data_list , i , j);
//左子区间
if((base_pos - 1) > i)
{
st.push(i);
st.push(base_pos - 1);
}
//右子区间
if((base_pos + 1) < j)
{
st.push(base_pos + 1);
st.push(j);
}
}
}
//测试
void quick_sort_main()
{
int data_list[] = {8,9,3,4,5,2,6,1,7,7,6,4,3,9};//平均情况
//int data_list[] = {1,2,3,4,5,6,7,8,9};//最坏情况
//int data_list[] = {9,8,7,6,5,4,3,2,1};
printf("data list init data:\n");
print_list(data_list , 0 , sizeof(data_list) / sizeof(int) - 1);
printf("quick sort begin ...\n");
quick_sort_nor(data_list , 0 , sizeof(data_list) / sizeof(int) - 1);
printf("quick sort end :\n");
print_list(data_list , 0 , sizeof(data_list) / sizeof(int) - 1);
return;
}