//-------小哼买书(先去重,然后再排序)--------------------//
#include "stdio.h"
//-------------数组打印函数------------//
//--函 数 名:Print_arr(int *arr, int len)
//--函数功能:对数组内的元素进行打印
//--输入参数:数组名,需要答应的长度(必须小于数组的长度)
//--返 回 值:无
//-------------------------------------//
void Print_arr(int arr[], int len)
{
int t;
for(t = 0; t < len; t ++)
{
printf("%d ", arr[t]);
}
printf("\n");
}
//-------------------数组输入函数----------------------------//
//--函 数 名:Input_arr(int *arr, int len)
//--函数功能:实现将数组的元素从键盘输入
//--输入参数:数组名,输入元素的个数(必须小于数组的实际长度)
//--返 回 值:无
//----------------------------------------------------------//
void Input_arr(int arr[], int len)
{
int k;
for(k = 0; k < len; k ++)
{
printf("请输入第%d个数:\n",k+1);
scanf("%d",&arr[k]);
}
printf("\n");
printf("输入的数为:\n");
Print_arr(arr, len);
printf("\n");
}
//-------------------快速排序(递归)----------------------------//
//--函 数 名:quick_sort(int *arr, int start, int end)
//--函数功能:对数组内的元素按照某种次序(升序或降序)进行排列
//--输入参数:数组名,开始位,结束位(数组元素的个数)
//--返 回 值:无
//----------------------------------------------------------//
void quick_sort(int arr[], int start, int end)
{
if(start > end)
{
return;
}
int mid = arr[start];//标志位
int left = start; //左侧寻找位
int right = end; //右侧寻找位
int temp;
while(left < right)
{
while(arr[right] >= mid && left < right)
{
right --;
}
while(arr[left] <= mid && left < right)
{
left ++;
}
if(left < right)
{
temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
// Print_arr(arr, 10);
}
// swap(&arr[left], &arr[right]);
}
/*------标志位就位--------*/
arr[start] = arr[left];
arr[left] = mid;
/*--------------运用递归的方法,分别处理左边与右边的部分----------------*/
quick_sort(arr, start, left - 1);//处理左边部分
quick_sort(arr,left + 1, end); //处理右边部分
}
//--------------去重函数---------------------//
//--函 数 名:delete_repat(int arr[], int len)
//--函数功能:对数组内的元素进行去重处理
//--输入参数:数组名,数组元素的个数
//--返 回 值:无
//----------------------------------------------------------//
void delete_repat(int arr[], int len)
{
int i;
int total = len + 1;
for(i = 0; i < len - 1; i ++)
{
if(arr[i] == arr[i + 1])
{
arr[i] = 0;
total -= 1;
}
}
printf("没有重复的数量为:%d\n", total);
printf("\n");
printf("分别为:\n");
for(i = 0; i <= len; i++)
{
if(arr[i] != 0)
{
printf("%d ",arr[i]);
}
}
printf("\n\n");
}
int main(void)
{
int arr[100] = {0};
int len;
printf("输入需要排列的数的个数(小于数组的实际长度):\n");
printf(" 按‘Enter’键确认输入\n");
scanf("%d", &len);
Input_arr(arr, len);
quick_sort(arr, 0, len - 1);
printf("排列之后的顺序为:\n");
Print_arr(arr, len);
printf("\n");
delete_repat(arr,len-1);
return 0;
}