接下來上**
#include
intmain
(void)
}for(j=
0;jprintf(
"%-5d ",a[j]);
printf(
"\n\n");
}return
0;
}
接下來上**for(i=
0;i1;++i)
//n個數,總共需要進行n-1次
}if(
1==f)
//f為1說明沒進行過冒泡,說明序列有序
break;
//若序列有序,則跳出排序即可
}
#include
intmain
(void)
}//每排序一次,就會將a[i](包括a[i])之後的最小值放在a[i]的位置
for(j=
0;jprintf(
"%-5d",a[j]);
printf(
"\n\n");
}return
0;
}
接下來上**for(i=
0;i1;++i)
//執行過後,k會儲存當前最小值的下標
//進行一次交換
t=a[k];
a[k]=a[i];
a[i]=t;
}
插入排序的遞迴實現:#include
intmain
(void)
//跳出迴圈則表明了"手中的牌的位置找到了"
a[j+
1]=t;
//將"牌"插入
for(j=
0;jprintf(
"%-5d",a[j]);
printf(
"\n\n");
}return
0;
}
對於插入排序優化的思考:void insert_sort(
int p,
intleft,
intright)
對於插入排序,最差情況下的時間複雜度為o(n²),若尋找插入點的位置時,我們不使用線性的依次尋找,而使用二分法,二分法查詢的時間複雜度為o(lgn)(這裡的lg是以2為底的)。這樣,可以將插入排序的時間複雜度將為o(n*lgn)。這樣是否合理呢?
答案是不能,因為找到插入點後,仍需要將插入點後面的元素向後移一位,這個過程的時間複雜度是o(n),這樣的話,二分法查詢插入點其實是多餘的。
三種基本排序
由於排序不僅是針對主關鍵字,那麼對於次關鍵字,因為待排序的記錄序列中可能存在兩個或者兩個以上的關鍵字相等的記錄,排序結果可能會存在不唯一的情況,所以我們給出了穩定與不穩定排序的定義。假設ki kj 1 i n,1 j n,i j 且在排序前的序列中 ri 領先於 rj 即i j 如果在排序後仍然領先...
三種基本排序方法
三種基本排序方法 includevoid func1 int a 10 交換排序法 void func2 int a 10 選擇排序法 void func3 int a 10 氣泡排序 int main int choice printf 請輸入你要選擇的排序方法 n scanf d choice ...
三種基本排序演算法
示例陣列 以公升序為例 for int i 0 i arr.length i 輪數 第一次 j下標從0開始,第0位與第1位相比較,當第0位大於第1位時 3 1 進行交換。交換完陣列為 第二次j為1,第1位與第2位比較,3 5,不交換。第三次j為2,第2位與第3位比較,5 2,交換。陣列為 第四次j為...