69,369
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <math.h>
int num; //输入数字的个数
int * data; //存输入的数字 0-9 数组
int * nums; // 存组成的数 数组
int numsIndex = 0; //组成的数的下标
/**
* 交换
* @param arr [description]
* @param index1 [description]
* @param index2 [description]
*/
void swap(int * arr, int index1, int index2){
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
/**
* [quickSort 快速排序]
* @param start [description]
* @param end [description]
*/
void quickSort(int start, int end){
if(start >= end){
return;
}
int low = start, high = end;
int middle = nums[start];//基数
while(low < high){
//从右往左找
while(low < high && nums[high] > middle){
high --;
}
//从左往右找
while(low < high && nums[low] <= middle){
low ++;
}
//交换
swap(nums, low, high);
}
//交换
swap(nums, start, low);
quickSort(start, low-1);
quickSort(low+1, end);
}
/**
* [createNums 创建N-1位数字]
* @param arr [description]
* @param len [description]
*/
void createNums(int arr[], int len){
int x = 0;
for(int i = 1; i < len; i++){ // 如果要创建N位数字(全排列) i从0开始
if(arr[1] == 0){ //0是第一个数,不要
return;
}
x += arr[i] * pow(10,len - i -1);
}
//存到数组中
nums[numsIndex++] = x;
}
/**
* 全排列
*思路:第一个数和后面的数(包括自己)交换,每个交换结果又用第二个数和后面的数交换,交换结果又用第三个数和后面的数交换....最后一个数和最后一个数交换。
* @param arr [数组]
* @param index [交换数位置]
* @param num [最后一个数的位置]
*/
void perm(int arr[], int index, int endIndex){
if(index == endIndex){ //一次递归结束
createNums(arr, endIndex+1);
}else{
for(int i = index; i <= endIndex; i++){
swap(arr, index, i); //交换数(index)和后面的数(包括自己)交换
perm(arr, index+1, endIndex); //递归 index+1
swap(arr, i, index); //交换完了,要换回来 以便 下一次循环
}
}
}
/**
* [showNums 打印数字]
*/
void showNums(){
for(int i = 0; i < numsIndex; i++){
if(i % 3 == 0){
printf("\n");
}
printf("%d ", nums[i] );
}
}
/**
* [enterNum 输入数字]
*/
void enterNum(){
printf("要输入数字的个数:");
scanf("%d", &num);
printf("%d\n", num);
data = (int*)calloc(num, sizeof(int)); //分配内存
nums = (int*)calloc(num - 1, sizeof(int));
for(int i = 0; i < num; i++){
printf("请输入第%d个数:", i+1);
scanf("%d", data + i);
printf("%d\n", data[i]);
}
perm(data, 0, num -1);
}
int main(){
enterNum();
printf("----------------------组成的数字如下:----------------");
showNums();
quickSort(0, numsIndex-1);
printf("\n------------------------排序后:-------------------\n");
showNums();
free(data);
free(nums);
return 0;
}