① 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還沒定義就用了