日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

插入排序就这么简单

發布時間:2025/3/20 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 插入排序就这么简单 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

插入排序就這么簡單

從上面已經講解了冒泡和選擇排序了,本章主要講解的是插入排序,希望大家看完能夠理解并手寫出插入排序的代碼,然后就通過面試了!如果我寫得有錯誤的地方也請大家在評論下指出。

插入排序介紹

來源百度百科:

插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,算法適用于少量數據的排序,時間復雜度為O(n^2)。是穩定的排序方法。

將一個數據插入到已經排好序的有序數據

  • 將要排序的是一個亂的數組int[] arrays = {3, 2, 1, 3, 3};
  • 在未知道數組元素的情況下,我們只能把數組的第一個元素作為已經排好序的有序數據,也就是說,把{3}看成是已經排好序的有序數據

一、第一趟排序

用數組的第二個數與第一個數(看成是已有序的數據)比較

  • 如果比第一個數大,那就不管他
  • 如果比第一個數小,將第一個數往后退一步,將第二個數插入第一個數去
int temp;if (arrays[1] > arrays[0]) {//如果第二個數比第一個數大,直接跟上} else {//如果第二個數比第一個數小,將第一個數后退一個位置(將第二個數插進去)temp = arrays[1];arrays[1] = arrays[0];arrays[0] = temp;}System.out.println("公眾號Java3y" + arrays);

二、第二趟排序

用數組的第三個數與已是有序的數據{2,3}(剛才在第一趟排的)比較

  • 如果比2大,那就不管它
  • 如果比2小,那就將2退一個位置,讓第三個數和1比較
    • 如果第三個數比1大,那么將第三個數插入到2的位置上
    • 如果第三個數比1小,那么將1后退一步,將第三個數插入到1的位置上
//第二趟排序--------------------if (arrays[2] > arrays[1]) {//如果第三個數比第二個數大,直接跟上} else {//如果第三個數比第二個數小,將第二個數往后退一個位置,讓第三個數跟第一個數比temp = arrays[2];arrays[2] = arrays[1];//如果第三個數比第一個大,那就插入到第二個數中if (temp > arrays[0]) {arrays[1] = temp;} else {//如果第三個數比第一個小,將第三個數插入到第一個數前面int swapTemp = arrays[0];arrays[0] = temp;arrays[1] = swapTemp;}}System.out.println("公眾號Java3y" + arrays);


....

三、簡化代碼

從前兩趟排序我們可以摸出的規律:

  • 首先將已排序的數據看成一個整體
  • 一個數組是需要n-1趟排序的,總是用后一位跟已排序的數據比較(第一趟:第二位跟已排序的數據比,第二趟:第三位跟已排序的數據比)
  • 用第三位和已排序的數據比,實際上就是讓第三位數跟兩個數比較,只不過這兩個數是已經排好序的而已。而正是因為它排好序的,我們可以使用一個循環就可以將我們比較的數據插入進去
//臨時變量int temp;//外層循環控制需要排序的趟數(從1開始因為將第0位看成了有序數據)for (int i = 1; i < arrays.length; i++) {temp = arrays[i];//如果前一位(已排序的數據)比當前數據要大,那么就進入循環比較[參考第二趟排序]while (arrays[i - 1] > temp) {//往后退一個位置,讓當前數據與之前前位進行比較arrays[i] = arrays[i - 1];//不斷往前,直到退出循環i--;}//退出了循環說明找到了合適的位置了,將當前數據插入合適的位置中arrays[i] = temp;}

上面的代碼還缺少了一個條件:如果當前比較的數據比已排序的數據都要小,那么while中的arrays[i - 1]會比0還要小,這會報錯的。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1at Main.main(Main.java:61)

我們應該加上一個條件:i>=1時才可以,如果i=1了下次再進去的時候就退出循環,讓當前數據插入到[0]的位置上

所以完整的代碼是這樣的:

//臨時變量int temp;//外層循環控制需要排序的趟數(從1開始因為將第0位看成了有序數據)for (int i = 1; i < arrays.length; i++) {temp = arrays[i];//如果前一位(已排序的數據)比當前數據要大,那么就進入循環比較[參考第二趟排序]while (i >= 1 && arrays[i - 1] > temp) {//往后退一個位置,讓當前數據與之前前位進行比較arrays[i] = arrays[i - 1];//不斷往前,直到退出循環i--;}//退出了循環說明找到了合適的位置了,將當前數據插入合適的位置中arrays[i] = temp;}System.out.println("公眾號Java3y" + arrays);

四、插入排序優化

二分查找插入排序的原理:是直接插入排序的一個變種,區別是:在有序區中查找新元素插入位置時,為了減少元素比較次數提高效率,采用二分查找算法進行插入位置的確定。

參考資料:http://www.cnblogs.com/heyuquan/p/insert-sort.html

五、擴展閱讀

C語言實現第一種方式:

void InsertSortArray ( int arr[], int n){//int arr[]={2,99,3,1,22,88,7,77,54};for (int i = 1; i < n; i++)// 循環從第二個數組元素開始{int temp = arr[i];//temp標記為未排序的第一個元素while (i >= 0 && arr[i - 1] > temp) //將temp與已排序元素從大到小比較,尋找temp應插入的元素{arr[i] = arr[i - 1];i--;}arr[i] = temp;}}

C語言實現第二種方式:

void insert ( int arr[], int n){int key = arr[n];int i = n;while (arr[i - 1] > key) {arr[i] = arr[i - 1];i--;if (i == 0)break;}arr[i] = key;}void insertionSort ( int arr[], int n){int i;for (i = 1; i < n; i++) {insert(arr, i);}}

測試代碼:

main(){int arr[] = {99, 2, 3, 1, 22, 88, 7, 77, 54};int i;insertionSort(arr, 9);for (int i = 0; i < 9; i++)cout << arr[i] << endl;return 0;}

參考資料:

  • https://www.cnblogs.com/xiaoming0601/p/5862793.html
  • http://blog.csdn.net/jianyuerensheng/article/details/51254415

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關注微信公眾號:Java3y

更多的文章可往:文章的目錄導航 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的插入排序就这么简单的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91亚洲欧美激情 | 欧美黑人又粗又大又爽免费 | 精品国偷自产一区二区三区 | 三级视频国产 | 舔花蒂| 婷婷亚洲一区 | 欧美精品xxxxx| 国产a级精品 | 亚洲图片中文字幕 | 精品电影一区二区 | 日本三区视频 | 日本体内she精高潮 男女视频在线免费观看 | 四虎国产成人精品免费一女五男 | 日本黄色大片在线观看 | 亚洲香蕉在线观看 | 污污内射久久一区二区欧美日韩 | 成 人 免费 黄 色 | 黑人借宿巨大中文字幕 | 欧美视频一二三 | 被扒开腿一边憋尿一边惩罚 | 日韩性生活大片 | 免费在线观看黄色av | 亚洲一区二区小说 | 97在线观看视频 | 91午夜视频在线观看 | 日本精品一区在线观看 | 欧美大片一区二区 | 天堂网a | 自拍偷在线精品自拍偷无码专区 | 国产东北真实交换多p免视频 | 天堂国产一区二区三区 | 色资源在线 | 国模视频一区二区 | 亚洲一区二区播放 | 日韩国产专区 | 动漫美女视频 | 天天操天天插天天干 | 国产精品嫩草69影院 | 国产精品成人无码专区 | av猫咪 | 国产视频二 | 欧美精品1区2区 | 在线理论视频 | 久久逼逼| 久久黄色 | 麻豆视频免费观看 | 久久久com | 无码久久精品国产亚洲av影片 | 色婷婷精品视频 | 日本免费一区二区在线 | 久久久久亚洲精品国产 | 天堂8在线天堂资源bt | 久久精品视频免费 | 久久精品国产亚洲av蜜臀色欲 | 毛片网站大全 | 精品一区二区视频在线观看 | 国产在线观看免费网站 | 成人h在线 | 毛片在哪里看 | 草久久 | av在线毛片 | 男生捅女生肌肌 | 美女福利视频导航 | 天天综合91 | 最新日本中文字幕 | 亚洲国产精彩视频 | 97爱爱视频 | 丝袜淫脚 | 右手影院亚洲欧美 | 天天有av | 一级伦理农村妇女愉情 | 国产一区二区在线免费观看 | 亚州av在线播放 | 中文字幕在线视频日韩 | 久久黑人| 嫩草嫩草嫩草嫩草 | 亚洲精品一区中文字幕乱码 | 国产麻豆影视 | 一区二区三区在线不卡 | 又黄又爽的免费视频 | 大尺度一区二区 | 亚洲男人天堂影院 | 国产高清视频在线播放 | a级国产毛片| 日本不卡不卡 | 大陆熟妇丰满多毛xxxⅹ | 青青草逼 | 日韩av电影网 | 美女隐私免费 | www.九九九 | 久久精品这里只有精品 | 男人操女人免费网站 | 国产在线操 | 日韩高清毛片 | 五月婷婷天 | 尤物视频一区 | 日韩成人三级 | 91视频国产精品 | 美女张开腿让男人桶爽 |