① c语言,递归排序问题,求解
#include<stdio.h>
#define
N
3
int
a[N]
=
{1,
2,
3};
//输出数组内容
void
print()
{
int
i;
for(i
=
0;
i
<
N;
++i)
{
printf("%d
",
a[i]);
}
printf("\n");
}
//交换数组中两个给定位置的数字
void
swap(int
p1,
int
p2)
{
int
t
=
a[p2];
a[p2]
=
a[p1];
a[p1]
=
t;
}
//递归排序函数
void
shuffle(int
p)
{
int
i;
//当前深度(即交换的左位置)已达最末位置,输出并返回
if(p
>=
N
-
1)
{
print();
return;
}
//从当前位置开始,将当前位置上的数依次与后面每一个位置上的数交换位置,
//然后递归调用本函数,调用结束再将交换的数还原。
for(i
=
p;
i
<
N;
++i)
{
swap(p,
i);
shuffle(p
+
1);
swap(p,
i);
}
}
int
main()
{
shuffle(0);
getchar();
return
0;
}
递归的部分初学者不太容易理解,可以仔细思考一下,最好在纸上推演一下这个过程,看看数组内容的变化规律。
② C语言递归快速排列
大概看下,首先你是用自定义函数int partition进行排序,但是函数并没有返回值return。应该是这个问题报错的
while(a[++i]<x){}
while(a[--j]>x){if(j==left)break;}
if(i<j)
swap(a[i],a[j]);
else break;
这段就不明白了,首先是获取由左数第一个比X大的数,然后又获取从右数第一个比X大的数,然后对两个数字的下标进行比较,这样很容易陷入死循环。
quickSort(a,left,p-1);
quickSort(a,p+1,right);
③ c语言递归排序怎么写、
哪有什么递归排序,递归只是一种函数调用方式,只是很多排序方法有用到递归,比如快速排序,搜索中的二分法,深搜,广搜。
④ C语言利用递归实现插入排序,选择排序,快速排序,归并排序算法。 要求有注释 ! 谢谢各位大神!
//InsertionSort
void insertionSort(int a[], int size) {
int i, j, key;
for (i = 0; i < size; i++) {
key = a[i];
j = i-1;
while (j >= 0 && key < a[j]) { //把元素插入到之前的有序元组中
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
//MergeSort
void merge(int a[], int p, int q, int r) { //合并两个子元组
int i, j, k, n1, n2;
int *array1, *array2;
n1 = q - p + 1,
n2 = r - q;
array1 = (int *)calloc(n1+1, sizeof(int));
array2 = (int *)calloc(n2+1, sizeof(int));
if (array1 == NULL || array2 == NULL) {
printf("Error: calloc failed in concat\n");
exit(EXIT_FAILURE);
}
for(i = 0; i < n1; i++)
array1[i] = a[p + i];
for(i = 0; i < n2; i++)
array2[i] = a[q + 1 + i];
array1[n1] = MAXNUMBER;
array2[n2] = MAXNUMBER;
i = 0, j = 0;
for(k = p; k <= r; k++)
if(array1[i] <= array2[j])
a[k] = array1[i++];
else
a[k] = array2[j++];
free(array1);
free(array2);
}
void mergeSort(int a[], int p, int r) {//归并的递归调用
int q;
if (p < r) {
q = (p+r)/2;
mergeSort(a,p,q);
mergeSort(a,q+1,r);
merge(a,p,q,r);
}
}
//QuickSort
int partition(int a[], int p, int r) {//快排的分组函数
int i, j, x, temp;
x = a[r];
i = p - 1;
for (j = p; j < r; j++)
if (x > a[j]) {
temp = a[++i];
a[i] = a[j];
a[j] = temp;
}
temp = a[++i];
a[i] = a[r];
a[r] = temp;
return i;
}
void quickSort(int a[], int p, int r) { //快排
int q;
if (p < r) {
q = partition(a, p, r);
quickSort(a, p, q-1);
quickSort(a, q+1, r);
}
}
//随即版的quickSort
int randomPartition(int a[], int p, int r){
int i, temp;
i = rand();
while( i < p || i > r)
i = rand();
temp = a[i];
a[i] = a[r];
a[r] = temp;
return partition(a,p,r);
}
void randomQuickSort(int a[], int p, int r){
int q;
if(p < r){
q = randomPartition(a,p,r);
randomQuickSort(a,p,q-1);
randomQuickSort(a,q+1,r);
}
}
//BubbleSort();//冒泡排序
void bubbleSort(int a[], int size) {
int i, j, temp;
for (i = size -1; i >= 0; i--)
for (j = 0; j < i; j++)
if (a[j] < a[j+1]) {
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
⑤ c语言 递归实现数组排序
#include<stdio.h>
#define SIZE 100
int arr[SIZE], n;
void arrsort(int pos){
if(pos == n-1) return;
arrsort(pos+1);
int i = pos+1, temp = arr[pos];
while(i < n){
if(arr[i] < temp){
arr[i-1] = arr[i];
i++;
}
else break;
}
i --;
arr[i] = temp;
}
void print(){
int i;
for(i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
}
int main(){
int i;
printf("输入待排序的数据的个数:");
scanf("%d", &n);
printf("输入数据,空格为分隔符号:\n");
for(i = 0; i < n; i++)
scanf("%d", &arr[i]);
printf("排序前:\n");
print();
arrsort(0);
printf("排序后:\n");
print();
return 0;
}
⑥ C语言递归解决数组排序
#include<stdio.h>
intMax(inta[],intlen)
{
if(len>1)
returna[len-1]>a[Max(a,len-1)]?len-1:Max(a,len-1);
return0;
}
intmain()
{
inta[10]={0,1,2,3,9,8,7,4,5,6};
printf("%d%d",Max(a,10),a[Max(a,10)]);
return0;
}
⑦ C语言:用递归的方式对数组排序:
#include<stdio.h>
#defineN100
voidselection_sort(inta[],intlen);
intmain()
{
inta[N],i=0,len;
while(scanf("%d",&a[i])==1)
{
i++;
}
len=i;
selection_sort(a,len);
for(i=0;i<len;i++)
{
if(i==0)
printf("%d",a[i]);
else
printf("%d",a[i]);
}
printf("
");
return0;
}
voidselection_sort(inta[],intlen)
{inti,j,t;
for(i=j=0;i<len;i++)
if(a[i]>a[j])j=i;
t=a[len-1];a[len-1]=a[j];a[j]=t;
if(len>1)selection_sort(a,len-1);
}
⑧ C语言:用递归的方式对数组排序
#include<stdio.h>
#defineN8
voidselection_sort(inta[],intn){
inti,t,imax=0;
if(n<1)return;
for(i=1;i<n;++i){
if(a[imax]<a[i])
imax=i;
}
if(imax!=n-1){
t=a[n-1];
a[n-1]=a[imax];
a[imax]=t;
}
selection_sort(a,n-1);
}
intmain(void){
inti,a[N]={8,5,4,6,1,2,3,7};
printf("排序前: ");
for(i=0;i<N;i++)
printf("%d",a[i]);
printf(" ");
selection_sort(a,N);
printf("排序后: ");
for(i=0;i<N;i++)
printf("%d",a[i]);
printf(" ");
return0;
}
⑨ c语言三种排序
常用的c语言排序算法主要有三种即冒泡法排序、选择法排序、插入法排序。
一、冒泡排序冒泡排序:
是从第一个数开始,依次往后比较,在满足判断条件下进行交换。代码实现(以降序排序为例)
#include<stdio.h>
int main()
{
int array[10] = { 6,9,7,8,5,3,4,0,1,2 };
int temp;
for (int i = 0; i < 10; i++)
{//循环次数
for (int j = 0; j <10 - i-1; j++)
{
if (array[j] < array[j+1])
{//前面一个数比后面的数大时发生交换 temp = array[j];
array[j] = array[j+1];
array[j + 1] = temp;
}
}
} //打印数组 for (int i = 0; i < 10; i++) printf("%2d", array[i]); return 0;}}
二、选择排序以升序排序为例:
就是在指定下标的数组元素往后(指定下标的元素往往是从第一个元素开始,然后依次往后),找出除指定下标元素外的值与指定元素进行对比,满足条件就进行交换。与冒泡排序的区别可以理解为冒泡排序是相邻的两个值对比,而选择排序是遍历数组,找出数组元素与指定的数组元素进行对比。(以升序为例)
#include<stdio.h>
int main()
{
int array[10] = { 6,9,7,8,5,3,4,0,1,2 };
int temp, index;
for (int i = 0; i < 9; i++) {
index = i;
for (int j = i; j < 10; j++)
{
if (array[j] < array[index])
index = j;
}
if(i != index)
{
temp = array[i];
array[i] = array[index];
array[index] = temp;
}
for(int i=0;i<10:i++)
printf("%2d"array[i])
return 0;
}
三、快速排序
是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
void QuickSort(int* arr, int size)
{
int temp, i, j;
for(i = 1; i <size; i++)
for(j=i; j>0; j--)
{
if(arr[j] <arr[j-1])
{
temp = arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}
}
}
⑩ C语言,关于用动态数组调用进行排序的问题(不知道为什么排序就跳出,用静态就不会)
shu=(int*)malloc(dm*sizeof(int)); printf("请输入输入数组大小和最大值(用空格分开)\n"); scanf("%d %d",&dm,&b);
将shu=(int*)malloc(dm*sizeof(int)); 放到scanf()之后,你的dm还没定义就用了