Giúp mình giải quyết bài tập cái hum vừa rồi học không tiếp thu được gì cả Bái tập 1: viết chương trình thực hiện các công việc sau: khai báo mảng có tối đa 50 phần tử nguyên nhập phần tử cho mảng đến khi nhập số 0 thì dừng tìm phần tử nhõ nhất trong mảng xoá giá trị có giá trị là k nhập từ bàn phím sắp xếp phần tử tăng dần bài tập 2:(bài tập nâng cao) viết chương trình thực hiện khai báo mảng 2 chiều có kiểu số nguyên nhập số hàng ,số cột của mảng phát sinh các số ngẫu nhiên trong khoảng tứ 1 đến 20,gán giá trị cho các phần tử của mảng sắp xếp mảng theo thứ tự tăng dần ở từng hàng khai báo mảng 1 chiều có kiểu dữ liệu số nguyên,hãy tiến hành đổ mảng 2 chiều trên vào mảng 1 chiều nơi khai báo Gợi ý: Phát sinh số ngẫu nhien sử dụng hàm random thư viện<stdlib.h> mang[j]=random(20)+1; hàm random tổng quát như sau: random(n):phat sinh số ngẫu nhiên từ 0 đến n vì vậy muốn phát sinh số ngẫu nhiện từ k đến n thì viết như sau random(n)+k; gợi ý: k=0; for(i=0;i<n;i++) for(j=0;j<m;j++) { Bước[k]=a[j] K++; }
Đề bài thứ 2 của bạn mình ko hiểu lắm _Nếu là phát sinh số ngẫu nhiên rồi là ngẫu nhiên thôi chứ sao lại có ngẫu nhiên từ k đến n ??? Thông thường thì nếu bài yêu cầu lấy số tự nhiên VD cho mảng có 50 phần tử thì nên random(500) nếu lấy = 50 thì sẽ có một số bị trùng nhau _Còn đổ từ 2 mảng vào 1 mảng thì có quy luật gì ko ? Đổ xen kẽ vào chẳng hạn ??? Còn cách giải cho xếp thứ tự tăng dần cho 1 hàng là : for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(a[j]<a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } //Bạn nhớ chú ý là toán tử gán = là gán từ phải sang trái chứ ko viết lung tung được đâu } }
phát sinh số ngẫu nhiên từ k đến n giống như kiểu chọn một số ngẫu nhiên giữa 5 và 10 thôi mà có gì đâu mà k0 hiểu các ngôn ngữ lập trình thường thì nó mặc định tạo ra một số ngẫu nhiên giữa 0 và một số n, nếu muốn tạo ra số ngẫu nhiên giữa k và n thì viết code cho chương trình tạo ra một loạt các số ngẫu nhiên từ 0 tới n-k rồi cộng k vào tất cả các số vừa được tạo ra là xong, nếu viết random(n)+k thì chương trình tự động làm việc này cho mình mà lập trình = ngôn ngữ gì vậy nói ra mới viết code đc chứ +_____+
Dùng C ! Tớ làm đến đoạn xóa phần tử thì chịu (đoạn này lâu roài quên mất cách xóa) Đoạn code sắp xếp nổi bọt thì chưa thuộc +_+ !
code C thì chưa học bao giờ nhưng mà thuật toán thì chắc cũng làm được :\ muốn xóa phần tử thì check xem phần tử nào có giá trị = k thì loại nó ra, đồng thời dồn các phần tử đứng sau phần tử đó xuống 1 bậc để cho mảng không có giá trị = null. chắc là bài tập bắt làm như thế
Code bên C thì tui ngại nhất là chạy 1 lúc 2 cái lặp và vòng lặp lồng nhau ko biết có 2 cái đó trong này ko nữa +_ + !
mảng 2 chiều chắc chắn phải có vòng lặp lồng nhau còn gì nữa trong đoạn này thì n là gì và m là gì thế '______' muốn sắp xếp thì có 1 cách khác là chạy qua mảng 1 vòng, đếm xem từng phần tử có bao nhiêu phần tử khác nhỏ hơn phần tử này. số phần tử nhỏ hơn sẽ chính là số thứ tự của phần tử này, hồi trước hay dùng cách sắp xếp này
thuật toán nổi bọt là bạn cho j chạy từ i .Tức là cho j=i for(int j=i;j<=m,j++) khi đó số vòng lặp của bạn phải chạy ít hơn ... còn bài 2 này không khác bài 1 là bao nhiêu đối với bài 1 thì hai vòng với i,j<=n còn bài 2 là i<=n và j<=m còn giá trị bất kì chắc là tùy mình thôi chủ yếu là sắp xếp dc .
Cái thân đó là đổi chỗ 2 giá trị a và a[j] cho nhau thôi, mà hoán vị a[j] và a[j+1] thì làm được gì cho đời +_+, biến i chạy từ 1->n-1, còn biến j chạy từ i->n được rồi. thích viết kiểu nào cũng được mà, có thể viết: if(a<a[j]) { a=a+a[j]; a[j]=a-a[j]; a=a-a[j]; } Không dùng thêm tham số temp. Mình khuyên các bạn nên dùng thuật toán Quick sort cho tất cả mọi bài toán, nó nhanh hơn nhiều so sới Bubble sort( gần như là nhanh nhất trong các thuật toán sắp xếp), mà thuật toán của nó cũng đơn giản, viết rất trực quan.
nếu lớn hơn thì đổi chỗ :\ sao k0 làm đc gì chỉ tội cái cách đấy thì chạy nhiều lần quá thôi ++ thuật toán quick sort nó như thế nào '______'
bài tập 1: #include<stdio.h> #include<conio.h> void main() { int mang[50]; int i,j,n,min,k,thutu; printf("nhap phan tu cho mang a:"); for(i=0;i<10;i++) {printf("a[%d]=",i); scanf("%d",&mang); if(mang==0)break; }n=i;//n luu tru so luong phan tu co trong mang min=mang[0]; for(i=1;i<n;i++) { if(mang<min) min=mang;} printf("\n min=%d",min); printf("\nmoi ban nhap k:"); scanf("%d",&k); //xoa for(i=0;i<n;i++) if(mang==k) {for(j=i;j<n;j++) mang[j]=mang[j+1]; n--;} //in lai mng khi xo k printf("\nmang khi da xo phan tu trung k:"); for(i=0;i<n;i++) printf("\n%d",mang); // sap xep thu tu for(i=n-1;i>0;i--) for(j=0;j<i;j++) { if(mang[j]>mang[j+1]) { thutu=mang[j]; mang[j]=mang[j+1]; mang[j+1]=thutu; } } printf("\nthu tu tang dan cu mang:"); for(i=0;i<n;i++) printf("%3d",mang); getch(); } các ban xem bài mình làm đúng kô,nếu bài mình còn thíu gì thì xin các pác giúp xíu thuật toán quick sỏt nó như thế nào vậy ai có thể giải = cách khác được thì pót lên cho mọi người xem thử
Bạn đặt code trong thẻ PHP đi (lúc copy) sẽ thấy dễ dàng để fix lỗi hơn ! Quick Sort là sắp xếp như thế nào?
sặc, Quick sort mà ko biết à ^^, sắp xếp có nhiều thuật toán như bubble sort (sắp xếp nổi bọt) <-cái này nhiều người xài, selection sort, shell sort, merge sort, quick sort.v.v.trong đó thuật toán quick sort là tương đối nhanh nhất, nhanh rất nhiều so với bubble sort bình thường, để bữa sau mình post thuật toán cho, hôm nay post hàm sắp xếp thôi. Mã: void quicksort(int a[],int l,int r) { int i,j,x,y; i=l; j=r; x=a[(l+r)/2]; do { while (a[i]<x) i=i+1; while (x<a[j]) j=j-1; if (i<=j) { y=a[i]; a[i]=a[j]; a[j]=y; i=i+1; j=j-1; } } while (i>j); if (l<j) quicksort(a,l,j); if (i<r) quicksort(a,i,r); } đầu chương trình gọi hàm quicksort(a,1,n) (n là số phần tử của mảng). Chạy thử với các input có từ 10.000 trở lên mới thấy sự khác biệt tốc độ của thuật toán quicksort và bubble sort và một số thuật toán khác ^^.
Quicksort( thuật toán sắp xếp phân đoạn) là một phương pháp sắp xếp tốt nhật, nghĩa là dù dãy khóa thuộc kiểu dữ liệu có thứ tự nào, quicksort cũng có thể sắp xếp được mà không có một thuật toán sắp xếp nào nhanh hơn quicksort về mặt tốc độ trung bình. Người sáng lập ra nó là C.A.R Hoare. Ý tưởng chủ đạo của phương pháp này có thể tóm tắt như sau: Sắp xếp dãy khóa k1,k2...kn thì có thể coi là sắp xếp đoạn từ chỉ số 1 tới chỉ số n trong dãy khóa đó. Để sắp xếp một đoạn trong dãy khóa, nếu đoạn đó có <=1 phần tử thì không cần phải làm gì cả, còn nếu dona59 đó có ít nhất 2 phần tử, ta chọn một khóa ngẫu nhiên của đoạn đó làm "chốt". Mọi khóa nhỏ hơn khóa chốt được xếp vào vị trí đúng trước chốt, mọi khóa lớn hơn khóa chốt được xếp vào vị trí đứng sau chốt. Sau phép hoán chuyển như vậy thì đoạn đang xét được chia thành 2 đoạn khác rỗng mà mọi khóa trong đoạn đầu đều <=chốt và mọi khóa trong đoạn sau đều >=chốt. Hay nói cách khác: Mỗi khóa trong đoạn đầu đều <=mọi khóa trong đoạn sau. Và vấn đề trở thành sắp xếp 2 đoạn mới tạo ra bằng phương pháp tương tự(đệ qui lại) có độ dài nhỏ hơn đoạn ban đầu. Độ nhanh thuật toán đã được test với các thuật toán sắp xếp Shell sort, Heap sort, insertion sort, distribution counting sort, exchage radixsort, straight radixsort, merge sort, Bubble sort.