Dĩ nhiên là code khó hơn Bubble sort rồi, dễ hơn chắc ai cũng áp dụng, thường trong pascal có phần Examples sẽ có code của Quicksort viết sẵn, paste ra sử dụng thôi ^^, những thuật toán cao yêu cầu tốc độ chạy nhanh thì những thuật toán nhỏ này phải làm cho tốt ^^. exchage radixsort với straight radixsort cũng rất nhanh, nhưng khá phức tạp, khó code, cái Quick sort là dễ code lắm rồi đó, chạy lại cực nhanh. Nếu ai xử lý trên file ngoài thì dùng thuật toán sắp xếp vun đống, sắp xếp ngoài merge sort, rất là tốt ^^. Thuật toán sắp xếp rất là nhiều, tìm kiếm cũng vậy, quan trọng là biết cách sử dụng và phát huy 1 cách hiệu quả các thuật toán đó thôi, dù gì đây cũng là những thuật toán nền, hầu như các bài toán đều sử dụng tới nó.
tomorrowneverdies - tên dài quá chẳng biết gọi tắt học những thứ này qua .... ??? Có thể trợ giúp RS vài điều về lập trình ko !
Em mới vào năm nhất học được mấy tuần "anh Xeno" :'>, cái này em học ở nhà á ^^. Thấy lập trình lên dạy thuật toán cơ bản là chính, còn chủ yếu mình ở nhà học nâng cao lên thôi, như vậy thấy hiệu quả hơn nhiều, học trên trường sao đủ thời gian tìm hiểu sâu +_+.
thì cũng mới đh năm thứ nhất mấy tuần chứ đâu :'> căn bản mới vào học mà cố thể hiện khả năng là mấy bố cho điểm thấp tẹt vì k0 làm đúng theo chỉ dẫn ngay thế nên cứ phải ... dạy gì thì biết nấy thôi
Chính xác, mới vào mà lộn xộn bon chen là tổ chức cho về với chúa ngay, mà thật ra mình đâu có biết gì nhỉ :'>, giờ nói thật quên hết thuật toán rồi, muốn làm lại phải coi lại chút mới làm được >"<.
hình mô tả quicksort nhìn dễ hiểu hơn giải thích chọn điểm bất kỳ, xếp tất cả các phần tử nhỏ hơn xuống mảng dưới, lớn hơn lên trên, tiếp tục làm đến khi nào mỗi mảng con chỉ có một phần tử thì thôi đúng k0 nhỉ
theo tớ hiểu thì thế này: thuật toán quicksort nó sắp xếp các phần tử trong 1 mảng bằng cách chọn 1 phần tử ngẫu nhiên làm phần tử gốc (trong hình nó chọn phần tử cuối cùng của mảng), rồi sắp tất cả các phần tử nhỏ hơn phần tử này vào một mảng phía dưới, các phần tử lớn hơn vào một mảng trên rồi có 2 mảng rồi tiếp tục làm thế với từng mảng cho đến khi mỗi mảng chỉ còn một phần tử thì thôi cái ảnh gif nó diễn tả cái này bằng lời, cái xọc nằm ngang chính là giá trị của phần tử đc chọn trong mảng đang tìm hiểu mergesort >< vẫn chưa hiểu được thuật toán của nó
Bro ơi ! Dùng bảng mã Unicode chuẩn đi chứ Unicode của huynh viết chữ ra dấu lộn xộn lắm ! Có thể làm tấm ảnh này chậm lại 1 chút ko +_+ !
hình chậm lại rồi đấy, để ý nhìn kỹ thì sẽ thấy thuật toán của nó còn cái vụ dấu thì ... quen dùng unicode tổ hợp đâm ra nó thế để chỉnh lại
Nếu mà quick sort hay nói chung cái gì sort cũng được (bao gồm cả quần sort luôn ) thì tui nghĩ mấy bác cứ kiếm thử cái giáo trì CTDL 1 của trường đại học nào đó , đọc vào là ok ngay mà
Code: chậc có toàn pro cho em bon chen zô kiếm ít kiến thức nha có 1 bài tap Mã: #include<stdio.h> #include<conio.h> #include<stdlib.h> void main() { int mang[10][10]; int i,j,n,m; int max,min,tong,dem; char kitu; //tao bang 2 chieu nhap so hang so cot do{ clrscr(); do{ printf("\nmoi ban nhap so hang:"); scanf("%d",&n); printf("moi ban nhap so cot:"); scanf("%d",&m); }while(n>10||n<3||m>10||m<3); printf("cac phan tu ngau nhien trong mang:\n"); for(i=0;i<n;i++) for(j=0;j<m;j++) { mang[i][j]=random(100)+1; printf("a[%d][%d]=%d\t",i,j,mang[i][j]); } printf("\ncac gia tri co trong matrix:\n"); for(i=0;i<n;i++) {for(j=0;j<m;j++) printf("%4d",mang[i][j]); printf("\n") ;} //tim phan tu lon nhat printf("\nphan tu lon nhat trong mang:"); int imax; int jmax; max=mang[0][0]; for( i=0;i<n;i++) for( j=0;j<m;j++) { if(mang[i][j]>max) { max=mang[i][j]; imax=i; jmax=j; } } printf("a[%d][%d]=%d",imax,jmax,max); //tim phan tu nho nhat printf("\nphan tu nho nhat trong mang:"); int imin; int jmin; min=mang[0][0]; for(i=0;i<n;i++) for(j=0;j<m;j++) { if(mang[i][j]<min) { min=mang[i][j]; imin=i; jmin=j; } } printf("a[%d][%d]=%d",imin,jmin,min); //tong cac phan tu trong ma tran printf("\ntong cac phan tu trong matrix:"); tong=0 ; for(i=0;i<n;i++) for(j=0;j<m;j++) { tong+=mang[i][j];//tong=tong+mang[i][j] } printf("=%d",tong); //in ra cac phan tu tren duong cheo cua matrix //in ra cac phan tu tren duong cheo trai>>phai tu tren xuong cua matrix int tongcheo=0; printf("\n cac phan tu tren duong cheo trai cua matrix:"); for(i=0;i<n;i++) { printf("\na[%d][%d]=%d\t",i,i,mang[i][i]); } printf("tong cua chung="); for(i=0;i<n;i++) { tongcheo+=mang[i][i]; } printf("=%d",tongcheo); //in ra cac phan tu tren duong cheo phai>>trai tu tren xuong cua matrix int tongcheo2=0; printf("\n cac phan tu tren duong cheo phai cua matrix:"); for(i=0,j=m-1;i<n,j>=0;i++,j--) { printf("\na[%d][%d]=%d\t",i,j,mang[i][j]); } printf("tong cua chung="); for(i=0,j=m-1;i<n,j>=0;i++,j--) { tongcheo2+=mang[i][j]; } printf("=%d",tongcheo2); //in cac phan tu chan printf("\ncac phan tu chan trong matrix:"); for(i=0;i<n;i++) for(j=0;j<m;j++) { if(mang[i][j]%2==0) printf("%4d",mang[i][j]); } //in cac phan tu le printf("\n") ; printf("\ncac phan tu le trong matrix:"); for(i=0;i<n;i++) for(j=0;j<m;j++) { if(mang[i][j]%2!=0) printf("%4d",mang[i][j]); } //in cac giat tri xuat hien trong ma tran trong ma tran int mangtam[100],t=0; int kiemtra=1; mangtam[0]=mang[0][0]; printf("\n") ; printf("\ncac gia tri trong matrix:"); for(i=0;i<n;i++) for(j=0;j<m;j++) { mangtam[t]=mang[i][j]; t++; } for(i=0;i<n;i++) for(j=0;j<m;j++) { kiemtra=1; for(t=1;t<i*n+j;t++) if(mang[i][j]==mangtam[t]) { kiemtra=0; break; } if(kiemtra==1) printf("%3d",mang[i][j]); } //ban co muon thoat chuong trinh ko printf("\nban co muon lap lai truong trinh ko (y/n):"); kitu=getche(); if(kitu=='n'||kitu=='N') exit(0); }while(kitu=='y'||kitu=='Y'); getch(); } giải thich lai cho em đoạn này được kô bà cô có giải thích rồi mà kó hiểu qá giờ quên mất tiêu làm lai với 1 bài khác thì kô mỡ công thức kô được vì quên mất thuật toán Mã: //in cac giat tri xuat hien trong ma tran trong ma tran int mangtam[100],t=0; int kiemtra=1; mangtam[0]=mang[0][0]; printf("\n") ; printf("\ncac gia tri trong matrix:"); for(i=0;i<n;i++) for(j=0;j<m;j++) { mangtam[t]=mang[i][j]; t++; } for(i=0;i<n;i++) for(j=0;j<m;j++) { kiemtra=1; for(t=1;t<i*n+j;t++) if(mang[i][j]==mangtam[t]) { kiemtra=0; break; } if(kiemtra==1) printf("%3d",mang[i][j]); } và còn bài nữaynếu muốn cho gái trị k vào vi trí đầu của mảng (man[0]) ta phải làm sao (bày thuật toán thôi nha để em tự làm) giai thích thuật toán luôn nha
sort với search quan trọng vì nó cần phải truy cập dữ liệu trong ổ cứng, mất thời gian nên càng dùng thuật toán có hiệu suất cao càng được lợi, dùng thuật toán dở hơi thì kể cả máy trâu bò chỉ cần sort 1 list có khoảng 1 triệu người thôi cũng mất cả năm vì thuật toán kém thường số lệnh nó tăng theo cấp số nhân, k0 cẩn thận thì bốc muối cái này là thuật toán dùng để in ra các phần tử trong mảng, kiểm tra các phần tử xem có trùng nhau không, tránh trường hợp in ra 2 giá trị giống nhau. có mảng mangtam để chứa các phần tử trong mang 2 chiều để sau đó so sánh nhưng mà cách này không cần thiết, nếu muốn thì so sánh một phần tử của mảng 2 chiều trực tiếp với các phần tử khác cũng được đoạn code này "t=1;t<i*n+j;t++" là để tiết kiệm lệnh, chứ nếu để "t=1;t<100;t++" thì chương trình vẫn chạy được. nếu muốn cho giá trị k vào đầu mảng thì 1 cách làm là dùng 1 loop để tăng tất cả các vị trí của phần tử lên 1 vd: phần tử [0] sẽ thành phần tử [1], phần tử [10] sẽ thành phần tử [11], sau đó gán giá trị k cho phần tử [0] lúc này đang rỗng thế là xong ::)
Nhưng mà RS thấy cái kiểm tra xem phần tử nào có giá trị nào trùng nhau ko để in ko bị trùng là ko cần thiết và cũng chẳng cần thiết ! vì trên thực tế trong nhiều người chí ít cũng có 1 vài info giống nhau => trùng ko in ra sao
có thể đấy là đầu bài bắt phải làm, cần thiết hay k0 đầu bài bảo cấm cãi với cả các giá trị trong ma trận toàn là số, trùng nhau in ra cũng thừa
chậc! đề bài bão in ra các giá trị trong mang thì nếu trùng nhau thì in 1 làn thôi chứ nhỡ có 10 giá trị trùng nhau thì in raq cả 10 à vậy thì sẽ dài dòng qá ^_^ còn chèn phần tử k nói thì hiểu nhưng mà chưa thử được ko bít phải thế này kô { a=a[i+1]; k=a[0]; } như thế này hả hay thêm vào biến đếm chưa thử à chỉ viết theo cảm nghĩ
tất nhiên là phải có 1 vòng lặp ở bên ngoài và cái đoạn "k=a[0]" sai rồi cái đấy phải để ra ngoài vòng lặp, thực ra để trong cũng được nhưng mỗi lần nó chạy là lại gán giá trị của k một lần <<-- phí phạm với cả phải là a[0]=k chứ k0 phải k=a[0]
^_^ tk bác để em về thữ còn muốn trong ma phương vuông a[3][3] muốn sắp xếp số từ 1 dến 9 sao cho tong hàng ngang =15 hàng dọc=15 chéo =15 thì dieu kien của nó viết như thế nào cái bày cho em thêm ví dụ minh họa nha