सबसे पहले, आप एक बाहर के सीमा उपयोग कर सकते है:
for(int j=0; j<a.length; j++) {
if(a[j] > a[j+1]) {
j == a.length-1
के लिए
, तो पाश हालत बल्कि j < a.length-1
होना चाहिए।
लेकिन, बुलबुला प्रकार में, आप जानते हैं कि k
गुजरता के बाद, सबसे बड़ा k
तत्वों सरणी के k
पिछले प्रविष्टियों में हल कर रहे हैं, इसलिए पारंपरिक बुलबुला तरह
public static void bubblesort(int[] a) {
for(int i=1; i<a.length; i++) {
boolean is_sorted = true;
for(int j=0; j < a.length - i; j++) { // skip the already sorted largest elements
if(a[j] > a[j+1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
is_sorted = false;
}
}
if(is_sorted) return;
}
}
का उपयोग करता है अब, यह अभी भी होगा जब सरणी में सबसे बड़े तत्वों की लंबी क्रमबद्ध पूंछ होती है, तो बहुत सारे अनावश्यक पुनरावृत्तियों का पालन करें, कहें कि आपके पास k,k-1,...,1
पहले k
तत्वों और k+1
से 100000000
के बाद क्रम में है। मानक बबल सॉर्ट k
बार पूरे सरणी के माध्यम से (लगभग) पास करेगा।
लेकिन अगर आप याद है जहां आप अपने पिछले अदला-बदली करने, तुम्हें पता है कि कि सूचकांक के बाद, वहाँ क्रम में सबसे बड़ा तत्व हैं, तो
public static void bubblesort(int[] a) {
int lastSwap = a.length-1;
for(int i=1; i<a.length; i++) {
boolean is_sorted = true;
int currentSwap = -1;
for(int j=0; j < lastSwap; j++) {
if(a[j] > a[j+1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
is_sorted = false;
currentSwap = j;
}
}
if(is_sorted) return;
lastSwap = currentSwap;
}
}
पूरे के माध्यम से केवल एक पास के साथ ऊपर के उदाहरण को सॉर्ट होगा सरणी, और शेष केवल एक (लघु) उपसर्ग के माध्यम से गुजरता है।
बेशक, सामान्य रूप से, यह आपको अधिक नहीं खरीदता है, लेकिन फिर बबल प्रकार को अनुकूलित करना वैसे भी व्यर्थ अभ्यास है।
तुम्हें कैसे पता कर सकते हैं वे पहले से ही हल कर रहे हैं? – Pol0nium
क्या आप is_sorted का जिक्र कर रहे हैं? यह सिर्फ एक झंडा है – kent
@ Pol0nium: क्योंकि एक इंसान इसे देखता है। सवाल यह है कि एल्गोरिदम को कैसे देखना है –